我们斗地主或者打麻将的时候,每轮开始时会起牌(也叫抓牌)。然后将抓到的牌插入到手中的牌中使其有序。这个插入的过程就和插入排序很类似。这篇博客就简单介绍一下插入排序。
给定一组序列,我们要将其升序排序,如:
1.假设我们第一次抓牌时,0号位置,抓到56,那么它就是有序的。
2.我们从第二次抓牌开始,来到1号位置,抓到25,它小于56,所以我们要将其插入到56前面。
3.第三次抓牌,来到2号位置,“牌面值”为37,就从前面排好的序列中找到第一个比37大的数,将这个数及其以后的数全部右挪一个位置,给37腾出地方。然后把37插入到移出的空位中(原来元素为56的1号位置)。
如此下去,直到将最后一个元素30插入到指定位置,排序结束。
java示例代码:
public class InsertionSort {
public static void sort(int[] array) {
for (int i = 1; i < array.length; i++) {
int j = 0;
while (j < i && array[j] <= array[i]) j++;
if (j != i) {
int tmp = array[i], nowLocation = i;
while (nowLocation > j) {
array[nowLocation] = array[nowLocation - 1];
nowLocation--;
}
array[nowLocation] = tmp;
}
}
}
public static void main(String[] args) {
int[] array = {56, 25, 37, 58, 95, 19, 73, 30};
sort(array);
for (int a : array)
System.out.printf("%-5d", a);
System.out.println();
}
}
插入排序最坏情况下时间复杂度为O(N^2),缺点就是涉及到元素的大批移动,如果用链表来存储数据,效率或许会高一些。
如果数组已经或多或少的有序,那么它在线性时间内运行。所以插入排序适用于只有少量乱序的大型数组。