定义:将每一个元素插入到已经有序的适当位置,在适当位置右边的所有元素都要向右移动一位。这种算法叫做插入排序。
代码:
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, a[j], a[j - 1]);
}
}
}
}
复杂度:
假设数组长度为N。
最坏情况比较次数:1 + 2 + 3 + …… + (N - 1) = (N * N) / 2
最好情况比较次数:N - 1
最坏情况交换次数:1 + 2 + 3 + …… + (N - 1) = (N * N) / 2
最好情况交换次数:0
平均比较次数:(N * N + 2N - 2) / 4
平均交换次数:(N * N) / 4
复杂度:O(N * N)
例子:
原序列:3 6 4 2 11 10 5
第一趟:3 6 4 2 11 10 5
第二趟:3 4 6 2 11 10 5
第三趟:2 3 4 6 11 10 5
第四趟:2 3 4 6 11 10 5
第五趟:2 3 4 6 10 11 5
第七趟:2 3 4 5 6 10 11