算法:
在计算机的实现中,为了给要插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。
对于一个很大且其中的元素已经有序(或接近有序)的数组进行排序将会比对随机顺序的数组或是逆序数组进行排序要快得多。
对于随机排列的长度为N且主键不重复的数组,平均情况下插入排序需要~/4次比较以及~
/4次交换。最坏的情况下需要~
/2次比较和~
/2次交换,最好情况下需要N-1次比较和0次比较。
代码实现:
public class Insertion {
public static void sort(Comparable[] a) {
// 将a[] 按升序排列
int N = a.length;
for (int i = 1; i < N; i++) {
// 将 a[i] 插入到 a[i-1]、a[i-2]、a[i-3]...之中
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) {
// 读取字符串,将他们排序输出
Comparable[] a = StdIn.readAllStrings();
sort(a);
assert isSorted(a);
show(a);
}
}
部分有序的数组可以优先考虑 插入排序