插入排序(insertion sort)

typedef int ElementType;

void InsertionSort (ElementType* A, int N) {
    int j, P;
    ElementType Tmp;
    for (P = 1; P < N; ++P) {
        Tmp = A[P];               // P 索引位置上的值,可能会被覆盖,所以对该值进行提前保存
        for (j = P; j > 0 && A[j-1] > Tmp; --j) {
            A[j] = A[j-1];
        }
        A[j] = Tmp;
    }
}

1. 插入排序的分析

数组中的 inversion 是指数组中具有性质 i<j(严格小于),但 A[i]>A[j](严格大于)的序偶((A[i],A[j]))。对于[34, 8, 64, 51, 32, 21]便存在如下序偶:

  • (34, 8), (34, 32), (34, 21);
  • (64, 51), (64, 32), (64, 21);
  • (51, 32), (51, 21);
  • (32, 21);

共 9 个inversion,而这也是由插入排序(非直接)执行的交换次数。情况恰好就是这样,交换两个不按原序排列的相邻元素恰好消除一个 inversion。

因此插入排序的精确时间复杂度为:O(I+N)I 为原始数组中的逆序数,因此,如果逆序数是 O(N),则插入排序以线性时间运行。

原文地址:https://www.cnblogs.com/mtcnn/p/9423561.html