一,原理分析:
插入排序就像是整理扑克牌一样,将每一张牌插入到其他已经有序的牌中的适当位置。在计算机的实现中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。这种算法即是插入排序。
与选择排序一样,当前索引左边的所有元素都是有序的,但他们的最终位置还不确定,为了给更小(大)的元素腾出空间,它们可能会被移动。但是当索引到达数组的右端时,排序就完成了。
和选择排序不同的是,插入排序所需的时间取决于输入中元素的初始顺序。例如,对一个很大且其中元素已经有序(或接近有序)的数组进行排序将会比对随机顺序的数组或是逆序数组进行排序要快得多。
二,Java实现:
public class Insertion {
public static int[] insertionSort(int[] a) {
int tempMax;
int j;
for (int i = 1; i < a.length; i++) {
tempMax = a[i];
j = i - 1;
while (0 <= j && a[j] < tempMax) {
a[j + 1] = a[j];
a[j] = tempMax;
j--;
}
}
return a;
}
三,算法特性分析:
在第一趟排序中,插入排序最多比较一次,第二趟最多比较两次,依次类推,最后一趟最多比较N-1次。因此有:
1+2+3+...+N-1 =N*N(N-1)/2
因为在每趟排序发现插入点之前,平均来说,只有全体数据项的一半进行比较,我们除以2得到:
N*N(N-1)/4
复制的次数大致等于比较的次数,然而,一次复制与一次比较的时间消耗不同,所以相对于随机数据,这个算法比冒泡排序快一倍,比选择排序略快。
与冒泡排序、选择排序一样,插入排序的时间复杂度仍然为O(N2),这三者被称为简单排序或者基本排序,三者都是稳定的排序算法。
如果待排序数组基本有序时,插入排序的效率会更高。