插入排序
- 将每一个数据插入到之前已经有序的数组中,在具体操作中需要将一部分元素向右移动一位。
- 对一个很大的且其中的元素已经有序的数组进行排序,插入排序会比随机顺序的数组快很多。
package sort;
public class Insertion {
public static void sort(Comparable[] a) {
int N=a.length;
for(int i=1;i<N;i++) {
for(int j=i;j>0&&less(a[j],a[j-1]);j--) {
exch(a,j,j-1);
}
}
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
private static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i - 1]))
return false;
}
return true;
}
public static void main(String[] args) {
String[] a = In.readStrings();
sort(a);
show(a);
}
}
结论
- 对随机排序的长度为N且主键不重复的数组,平均情况下插入排序需要~N2/4 次比较以及~N2/4次交换
- 《算法》这本书上说,对于长度为N的Double型随机数组,元素值均在0.0到1.0之间,插入排序比选择排序要快1.7倍左右。