插入排序的原理:
将整个数组分为两个区间:
- 待排序区间[bound, array.length)
- 已排序区间 [0, cur);
具体操作:
每次在待排序区间选择第一个元素,在有序区间从后往前和这个元素进行比较,在符合排序规则的位置进行插入。如果不满足,那么就将已经排序区间的元素往后挪一位。
具体代码实现如下:
//升序为例
public static void insertSort(int[] array) {
//外层循环代表[bound, array.length)待排序区间
for (int bound = 0; bound < array.length; bound++) {
//bound 下标的元素就代表待插入元素
int temp = array[bound];
int cur = bound - 1;
for (; cur >= 0; cur--) {
//内层循环代表[0, cur)以排序区间
if (array[cur] > temp) {
//如果不满足升序条件就往后挪一位
array[cur + 1] = array[cur];
} else {
break;
}
}
array[cur + 1] = temp;
}
}
时间复杂度 | 空间复杂度 | ||
---|---|---|---|
最好 | 平均 | 最坏 | |
O(n) | O(n ^ 2) | O(n ^ 2) | O(1) |
数据有序 | 数据逆序 |
稳定性:稳定
插入排序,初始数据越接近有序,时间效率越高。