**算法描述**
1. 将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)
2. 重复以上步骤,直到整个数组有序
**算法实现**
public static void main(String[] args) {
int[] a = {9, 3, 7, 2, 5, 8, 1, 4};
// i 代表待插入元素的索引
for (int i = 1; i < a.length; i++) {
int t = a[i]; // 代表待插入的元素值
int j = i;
System.out.println(j);
while (j >= 1) {
if (t < a[j - 1]) { // j-1 是上一个元素索引,如果 > t,后移
a[j] = a[j - 1];
j--;
} else { // 如果 j-1 已经 <= t, 则 j 就是插入位置
break;
}
}
a[j] = t;
System.out.println(Arrays.toString(a));
}
}
控制台输出:
1
[3, 9, 7, 2, 5, 8, 1, 4]
2
[3, 7, 9, 2, 5, 8, 1, 4]
3
[2, 3, 7, 9, 5, 8, 1, 4]
4
[2, 3, 5, 7, 9, 8, 1, 4]
5
[2, 3, 5, 7, 8, 9, 1, 4]
6
[1, 2, 3, 5, 7, 8, 9, 4]
7
[1, 2, 3, 4, 5, 7, 8, 9]
**与选择排序比较**
1. 二者平均时间复杂度都是 $O(n^2)$
2. 大部分情况下,插入都略优于选择
3. 有序集合插入的时间复杂度为 $O(n)$
4. 插入属于稳定排序算法,而选择属于不稳定排序
**提示**
*插入排序通常被轻视,其实它的地位非常重要。小数据量排序,都会优先选择插入排序*
面试题:数组18 23 19 9 23 15,使用选择插入算法,第三轮排序后的结果是
第一轮:18 23 19 9 23 15
第二轮:18 19 23 9 23 15
第三轮:9 18 19 23 23 15