1.思路:我们可以先思考一个问题,怎样往一个有序数组中添加一个元素并且保证这个有序数组依然有序。解决这个问题很简单,只需要遍历数组找到应该插入的位置即可。插入排序就是这种思想。我们可以将数组分为已排序区间和未排序区间,初始时已排序区间只有一个元素,可以视为一个有序数组。每次拿出未排序区间的第一个元素插入已排序区间,重复这个过程直到未排序区间为空,插入排序结束。
2.图解:对数组[4,5,6,1,3,2]进行插入排序,步骤如下图:
3.代码实现:
public void insertSort (int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 1; i < arr.length; i++) {
int temp = arr[i]; // 未排序区间的第一个元素
int j = i - 1; //已排序区间的最后一个元素
for (; j >= 0; j--) {
if (arr[j] > temp) {
arr[j+1] = arr[j]; // 后移
} else {
break;
}
}
arr[j+1] = temp; // 插入
}
}
4.性质
①时间复杂度:O(n^2) ②空间复杂度:O(1) ③原地排序 ④稳定排序