• 插入排序(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),则插入排序以线性时间运行。

  • 相关阅读:
    SESSION与COOKIE的区别
    一位36岁程序员的困惑(转)
    COOKIE&&SESSION
    PHP递归实现层级树状展现数据
    小程序优化
    css层级
    组件封装
    webpack构建流程
    HTTP2.0
    vue中子组件修改父组件传入的值
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9423561.html
Copyright © 2020-2023  润新知