插入排序(经典)

思路分析

基本思想为:

把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素,排序过程中每次从无序表中取出一个元素,将它与有序表中元素依次比较插入到适当位置,使之成为新的有序表。

代码实现

测试数据大小 花费时间(单位:毫秒)
10000 22
50000 431
80000 1074
140000 3214

InsertSort

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.yukinoshita.algorithm.sort;

import java.util.Arrays;
import java.util.Random;

public class InsertSort {
public static void main(String args[]) {
int[] arr = {3, 9, -1, 10, -2};

System.out.println("排序前:" + Arrays.toString(arr));
insertSort(arr);
System.out.println("排序后:" + Arrays.toString(arr));

// 测试算法性能
testPerformance();
}

private static void insertSort(int[] arr) {
for(int i=1;i<arr.length;i++) {
int insertVal = arr[i];//待插入有序表的元素
int insertIndex = i-1;//该元素应该插入的位置
while(insertIndex>=0 && insertVal<arr[insertIndex]) {
//说明还没找到该插入的位置
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex+1] = insertVal;
}
}

// 测试算法性能的方法
public static void testPerformance() {
int size = 50000; // 数组大小
int[] arr = new int[size];
Random random = new Random();

// 生成无序数组
for (int i = 0; i < size; i++) {
arr[i] = random.nextInt(100000); // 随机数范围可以根据需要调整
}

long startTime = System.currentTimeMillis(); // 记录开始时间
insertSort(arr); // 排序
long endTime = System.currentTimeMillis(); // 记录结束时间

System.out.println("排序大小: " + size);
System.out.println("排序时间: " + (endTime - startTime) + " 毫秒");
}


}