4 插入排序
- 在开始学习插入排序之前,让我们先对 for 循环做个补充:如下是关于 for 循环结束时,i 的取值的演示代码
int i;
for (i = 5; i >= 0; i--) {
System.out.print(i);
}
System.out.println("\nfor循环结束时i=" + i);
System.out.println("-----------------");
for (i = 0; i <= 5; i++) {
System.out.print(i);
}
System.out.println("\nfor循环结束时i=" + i);
运行结果:
543210
for循环结束时i=-1
-----------------
012345
for循环结束时i=6
我们可以看到,当for循环结束时,i会最后一次执行for循环语句中的i++或者i–,那么在此基础之上我们来讲讲数组排序中的插入排序。
4.1插入排序原理
- 插入排序是将数组分为两部分, 将后部分的首部元素逐一与前部分的每一个元素从后往前进行比较,在合理位置插入 。
- 插入排序算法效率要高于选择排序和冒泡排序
步骤 | 未排序数组array:[7,2,3,8,1] |
---|---|
第一步: 在数组中划分边界,将边界右数第一个元素array[1]赋值于temp,再将temp和7进行比较 | [7|2,3,8,1] |
因temp小于7,则将array[1]的值改为array[0]的值 | [7|7,3,8,1] |
遍历结束,到达尽头,不执行循环语句体,将temp值赋予array[0],边界右移 | [2,7|3,8,1] |
第二步: 将边界右数第一个元素array[2]赋值于temp,再将temp和7进行比较 | [2,7|3,8,1] |
因temp小于7,则将array[2]的值改为array[1]的值 | [2,7|7,8,1] |
继续遍历,因temp不小于2,则不执行循环语句体,再将temp值赋予array[1],边界右移 | [2,3,7|8,1] |
第三步: 将边界右数第一个元素array[3]赋值于temp,再将temp和8进行比较 | [2,3,7|8,1] |
因temp不小于7,则不执行循环语句体,边界右移 | [2,3,7,8|1] |
第四步: 将边界右数第一个元素array[4]赋值于temp,再将temp和8进行比较 | [2,3,7,8|1] |
因temp小于8,则将array[4]的值改为array[3]的值,继续遍历 | [2,3,7,8|8] |
因temp小于7,则将array[3]的值改为array[2]的值,继续遍历 | [2,3,7,7|8] |
因temp小于3,则将array[2]的值改为array[1]的值,继续遍历 | [2,3,3,7|8] |
因temp小于2,则将array[1]的值改为array[0]的值,继续遍历 | [2,2,3,7|8] |
遍历结束,到达尽头,不执行循环语句体,将temp值赋值于array[0] | [1,2,3,7|8] |
参考代码:
int[] arr = {7, 2, 3, 8, 1};
System.out.println("未排序元素:\t " + Arrays.toString(arr));
System.out.println("--------------开始排序-----------------");
int i, j, temp;
for (i = 1; i < arr.length; i++) {
temp = arr[i];
for (j = i - 1; j >= 0 && temp < arr[j]; j--) {
arr[j + 1] = arr[j];
System.out.println("\t\t\t " + Arrays.toString(arr));
}
arr[j + 1] = temp;
System.out.println("第" + i + "轮排序结果:" + Arrays.toString(arr));
System.out.println("--------------------------------------");
}
运行结果:
未排序元素: [7, 2, 3, 8, 1]
--------------开始排序-----------------
[7, 7, 3, 8, 1]
第1轮排序结果:[2, 7, 3, 8, 1]
--------------------------------------
[2, 7, 7, 8, 1]
第2轮排序结果:[2, 3, 7, 8, 1]
--------------------------------------
第3轮排序结果:[2, 3, 7, 8, 1]
--------------------------------------
[2, 3, 7, 8, 8]
[2, 3, 7, 7, 8]
[2, 3, 3, 7, 8]
[2, 2, 3, 7, 8]
第4轮排序结果:[1, 2, 3, 7, 8]
--------------------------------------