插入排序
- 核心思想:假设前半个区间是有序的,那么我们将先取后半个区间的第一个值A(该数也可以说是有序区间的后面的那个数,也许这样更清楚),与前半个区间从后往前进行比较交换,找到A适合的位置停止比较交换即可。(说是说插入排序,但其过程实现还是比较和交换)
- 举例:【1、2、4、5、3、0】,建立升序数组
- 已知:【1、2、4、5】这个区间有序,我们只需其考虑后面那个数【3】在有序区间的位置即可,具体流程如下:
【1、2、4、5、3、0】原数组
【1、2、4、5、3、0】将【3】与 它前面的数【5】进行比较,【3】小,交换,如下
【1、2、4、3、5、0】将【3】与它前面的数【4】进行比较,【3】小,交换,如下
【1、2、3、4、5、0】将【3】与它前面的数【2】进行比较,【3】大,结束,我们得到了有序区间【1、2、3、4、5】
图解
取自网络
代码模板
public void InsertSort() {
int[] arr = new int[]{3, 4, 5, 2, 1};
//可以直接从arr[1]开始
for (int i = 1; i < arr.length; i++) {
//内循环要做的就是将值插入到有序区间中合适的位置,使之依然保持有序
//有序区间为[0,i-1]
for (int j = i - 1; j >= 0; j--) {
//arr[j+1]即为有序区间的后面紧跟的值
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
} else break;
}
}
//打印测试
for (int i : arr) {
System.out.println(i);
}
}
插入排序平均时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度为O(1)