Day_12,归并排序时间复杂度计算

归并排序详细代码及思路可见我之前的文章归并排序
今天讲讲,为什么归并排序的时间复杂度是θ(nlgn)
我们知道归并排序是利用 递归函数 进行计算的一种分治排序算法,因此对其时间复杂度也可以用递归的方式进行计算。
首先我们要知道分治算法的流程: 分解、计算(将分解后的进行排序)、合并
分解: 假设分解成a个问题需要的运行时间为D(n)
计算: 假设 T(n) 是问题规模为n的运行时间,我们将其分解成a个子问题,假设此时每个子问题的规模是原来的1/b (对于归并排序来说,此时a=b=2) ,求解这a个子问题需要 aT(n/b)的运行时间
合并: 假设合并分解后的解需要的时间为C(n)
特殊情况,当n的规模足够小的时候,这里假设一个c为界限,当n≤c的时候,求解需要的时间为常量,记作θ(1)
因此分治算法的复杂度为
在这里插入图片描述
将上述思想带入归并排序

void merge_sort(int *data, int start, int end, int *result)
{
    if (start < end)
    {
        int mid = start + (end-start) / 2; //分解
        merge_sort(data, start, mid, result);  
        merge_sort(data, mid + 1, end, result);
        merge(data, start, mid, end, result);  //合并
    }
}

图B
分解: 分解仅仅计算中间元素的位置,如上代码的“//分解”,因此运算时间为常量及θ(1)
计算: 对于归并排序来说,a=b=2
合并: 如上面代码的“//合并”,合并的时间取决于n,运算时间为常量及θ(n)
特殊情况 当n=1的时候,仅需要经过一次运算,因此c=1
归并排序的运行时间递归式为:
在这里插入图片描述
为方便计算,我们令 θ(1)=c,则θ(n)=cn,运行时间递归式转化为:
在这里插入图片描述
现在这里暂时不用“主定理”进行计算,观察下列分解方式可知道 2T(n/2) = cnlgn
二叉树的深度 L = lgn,每层的运行时间为 cn
lg在此处所有的均为log2
在这里插入图片描述
因此 n>1 时,T(n) = cnlgn+cn,将 θ(n)=cn 带入,得到 T(n) = θ(n)lgn+θ(n)=(lgn + 1)θ(n),因为1的影响小,因此忽略1的代价,最终得到我们常见的 T(n) =θ(nlgn)

留一道课后习题证明你学会了 我也太好了吧!

Q: 一个已经排好序的数组A,以及一个查找对象v,利用二分法查找在数组A中是否存在v,利用递归思想,并求出其时间复杂度,下期给答案

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值