直接插入排序的时间复杂度

分为最好和最坏两种情况,分别讨论

设原先有n个元素


最好情况

在最好情况下,即排序之前的序列本身就是有序的,那么每两个元素仅需对比一次,那么总共对比n-1次,时间复杂度为

O(n)


最坏情况

在最坏情况下,即原本为逆序

下面通过一个例子来说明

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5a-G6KiA,size_20,color_FFFFFF,t_70,g_se,x_16

这里需要用到代码进行参考,更加直观

//直接插入排序(带哨兵)
void InsertSort(int A[],int n){
    int i,j;
    for(i=2;i<=n;i++)                 //依次将A[2]~A[n]插入到前面已排序序列
        if(A[i]<A[i-1]){              //若A[i]关键码小于其前驱,将A[i]插入有序表
            A[0]=A[i];                //复制为哨兵,A[0]不存放元素
            for(j=i-1;A[0]<A[j];--j)  //从后往前查找待插入位置
                A[j+1]=A[j];          //向后挪位
            A[j+1]=A[0];              //复制到插入位置
        }
}

我们来通过数学归纳法列一下

第一趟:

70与80比较                                                                比较1次

进入if

将70放在0号位(即哨兵位)                                     移动1次

将哨兵与80进行比较                                                  比较1次

进入for

将80右移一位                                                             移动1次

此时由于j指向了哨兵,不满足A[0]<A[j],退出for循环

将A[0]的70移到A[j+1]                                                  移动1次

总共:     

第1趟    移动3次                比较2次

 第2趟    移动4次                比较3次

 第3趟    移动5次                比较4次

......

而一共有n个元素,总共有n-1趟

第n-1趟须移动i+2次,比较i+1次


故总的移动次数为

gif.latex?%5Cfn_jvn%20%5Csum_%7Bi%3D2%7D%5E%7Bn%7D%28i&plus;1%29

总的比较次数为

gif.latex?%5Cfn_jvn%20%5Csum_%7Bi%3D2%7D%5E%7Bn%7D%28i%29

注:此处考虑与哨兵的比较,若不考虑与哨兵的比较则在此基础上再减去(n-1)

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值