一、插入排序介绍
1、介绍
插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
2、插入排序思想
插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
3、插入排序思路图
二、插入排序实现
使用插入排序对 101,34,119,1 这四个数进行从小到大的排序。
1、推导过程
1 //推导过程
2 public static void insertSort(int[] arr) {
3
4 //第一轮
5 int insertVal = arr[1]; //定义待插入的数
6 int insertIndex = 1 - 1; //即 arr[1]的前面这个数的下标
7
8 // 给 insertVal 找到插入的位置
9 // 说明
10 // 1.insertIndex >= 0 保证在给 insertVal 找插入位置,不越界
11 // 2.insertVal < arr[insertIndex] 说明待插入的数,还没有插入位置
12 // 3. 就需要将 arr[insertIndex] 后移,待插入的下标就要往前移,即insertIndex--
13 while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
14 arr[insertIndex + 1] = arr[insertIndex];
15 insertIndex--;
16 }
17 //当退出 while 循环时,说明插入的位置找到 ,insertIndex + 1
18 arr[insertIndex + 1] = insertVal;
19 System.out.println("第一轮:" + Arrays.toString(arr));
20
21
22 //第二轮
23 insertVal = arr[2];
24 insertIndex = 2 - 1;
25 while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
26 arr[insertIndex + 1] = arr[insertIndex];
27 insertIndex--;
28 }
29 arr[insertIndex + 1] = insertVal;
30 System.out.println("第二轮:" + Arrays.toString(arr));
31
32
33 //第三轮
34 insertVal = arr[3];
35 insertIndex = 3 -1;
36 while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
37 arr[insertIndex + 1] = arr[insertIndex];
38 insertIndex--;
39 }
40 arr[insertIndex + 1] = insertVal;
41 System.out.println("第三轮:" + Arrays.toString(arr));
42
43 }
2、封装方法
1 public static void insertSort(int[] arr) {
2
3 int insertVal = 0; //声明变量,初始化为0
4 int insertIndex = 0; //声明变量,初始化为0
5
6 for (int i = 1; i < arr.length; i++) {
7 insertVal = arr[i]; //定义待插入的数
8 insertIndex = i - 1; //即 arr[1]的前面这个数的下标
9
10 // 给 insertVal 找到插入的位置
11 // 说明
12 // 1.insertIndex >= 0 保证在给 insertVal 找插入位置,不越界
13 // 2.insertVal < arr[insertIndex] 说明待插入的数,还没有插入位置
14 // 3. 就需要将 arr[insertIndex] 后移,待插入的下标就要往前移,即insertIndex--
15 while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
16 arr[insertIndex + 1] = arr[insertIndex];
17 insertIndex--;
18 }
19
20 //如果待插入的位置就是本身的位置,就不需要执行这一步,否则把值插入到合适的位置
21 if (insertIndex + 1 != i) {
22 arr[insertIndex + 1] = insertVal;
23 }
24
25 System.out.println("第" + i + "轮:" + Arrays.toString(arr));
26 }
27 }
Tip:如果需要升序,将 while 中的 insertVal > arr[insertIndex] 即可。
3、性能测试
1 public static void main(String[] args) {
2
3 //创建80000个随机的数组
4 int[] arr2 = new int[80000];
5 for(int i = 0; i< 80000;i++) {
6 arr2[i] = (int)(Math.random() * 80000);
7 }
8
9 Date date1 = new Date();
10 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
11 String date1String = format.format(date1);
12 System.out.println("排序前的时间是="+date1String);
13
14 //测试插入排序
15 insertSort(arr2);
16
17 Date date2 = new Date();
18 String date2String = format.format(date2);
19 System.out.println("排序后的时间是="+date2String);
20
21 }
可以看出,使用插入法排序80000个数据大约需要2-3秒。