1. 定义
插入排序有点像玩扑克牌, 将每一张牌插入到其他已经有序的牌中合适的位置, 使整体有序。
2. 排序的思路
将数组分为已排序跟未排序区间。 初始0下标位置作为已排序区间,下标1到n-1作为未排序区间,每次从左到右从未排序区间取出元素与已排序区间元素进行比较找到合适的位置并插入, 如此反复得到最终的排序结果
如array: [2, 1, 6, 8, 3, 7] 执行轨迹如下:
第1次选择排序后:1, 2, 6, 8, 3, 7,
第2次选择排序后:1, 2, 6, 8, 3, 7,
...
第5次选择排序后:1, 2, 3, 6, 7, 8,
最终的结果[1, 2, 3, 6, 7, 8]
2. 代码实现
public class Insertion extends SortBase {
public static void main(String[] args) {
Comparable[] a = new Comparable[] {2, 1, 6, 8, 3, 7};
sort(a);
System.out.print("排序结果:");
show(a);
showLessAndExchCount(a);
}
public static void sort(Comparable[] a) {
//外循环代表未排序区间
for (int i = 1; i < a.length; i++) {
//内循环代表已排序区间
for (int j = i; j > 0; j--) {
if (less(a[j], a[j - 1])) {
exch(a, j, j-1);
} else {
break;
}
}
System.out.print("第"+(i)+"次选择排序后:");
show(a);
}
}
}
运行结果如下:
第1次选择排序后:1, 2, 6, 8, 3, 7,
第2次选择排序后:1, 2, 6, 8, 3, 7,
第3次选择排序后:1, 2, 6, 8, 3, 7,
第4次选择排序后:1, 2, 3, 6, 8, 7,
第5次选择排序后:1, 2, 3, 6, 7, 8,
排序结果:1, 2, 3, 6, 7, 8,
排序元素个数:6, 比较次数:8, 交换次数:4
3. 分析
- 是原地排序算法
- 是稳定排序算法
4. tradeoff
插入排序依赖于原数组本身的有序性,原来有序性越高排序性能越好。 如果原来数组本身就是有序的, 插入新元素时间复杂度是O(n)。 反之是逆序的,是否复杂度是O(n^2)