核心思想
来自于玩扑克牌时从牌堆中取出一张牌,和手中的牌比较后找到合适位置然后插入到手牌中
算法实现
- Java版
public static int[] insertSort(int[] data) {
//初始化: 从第二个元素开始循环
for (int i = 1; i < data.length; i++) {
//不变式:
//取出元素与前一个比较
//这一步类似于手中已经有一张牌后从牌堆中抓一张与手中卡牌比较
int key = data[i];
int j = i - 1;
while (j >= 0 && data[j] < key)) {
//将卡牌不断向前推进,类似将这张卡牌向前一张一张挪动
data[j + 1] = data[j];
j = j - 1;
}
//终止:
//此时卡牌的比较工作已经完成,当前下标就是卡牌排序后的位置
data[j + 1] = key;
}
return data;
}
算法分析
- 最坏情况
如果遇到如下数组
排序前 [1,2,3,4,5,6,7]
排序后 [7,6,5,4,3,2,1]
则每次都需要进行 n - x 次交换,例如从1到7 需要进行七次交换,这将会导致每次排序都是最坏情况 O(n^2)
针对此情况改进后的版本可以看 希尔排序
这是一种进行区间交换排序尽量降低最坏情况发生的插入排序算法