前言
插入排序(Insertion Sort)
大家应该都玩过扑克牌斗地主(不是欢乐斗地主啊),最喜欢除了炸弹外就是5张以上的顺子了(我们家乡话叫链子)。在每起一张牌的时候你总是能够准确的插入到一个有顺序的位置,这种按牌的大小插入到一个有序的序列中就是插入排序的思想。为了方便记忆也可以称之为扑克牌算法。
基本思路
- 默认第一个元素就是有序的,选择第二个元素与第一个元素比较,第二个元素小于第一个元素就与之交
- 换位置。这样前面两个元素就是有序的了。
- 用第三个元素依次与前面二个有序的元素比较。如果小于之前的元素就交换位置,这样前面三个元素都是有序的了。
- 用第四个元素依次与前面三个有序的元素比较...
(如果上面的思路描述你没看懂也没关系,看下面的图解)
图解





第五轮:6依次比较前五个元素,交换过程参考第三轮,直至比较6>4结束,最后一轮也结束。
看了这个图解再回过头看下思路
代码
JAVA版本
import java.util.Arrays;
public class InsertionSort {
public static void main(String []args) {
int[] array = new int[]{8,7,9,4,3,6};
sort(array);
System.out.print(Arrays.toString(array));
}
public static void sort(int[] array){
for(int i=1;i<array.length;i++){
for(int j = i;j>0;j--){
if(array[j] < array[j-1]){
int temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
}
}
//System.out.println("第"+i+"轮:"+Arrays.toString(array));
}
}
}
注意,千万不要死记代码,很容易忘记,算法思想远比代码重要。
效率
时间复杂度: O() 空间负责度: O(1) 稳定性:稳定
本章关键字总结:扑克牌 插入 有序
另外冒泡排序请参考:高效理解排序之——冒泡排序-JAVA版(简洁明了,非无脑COPY)