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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值