归并排序算法的时间复杂度

来自教程:https://time.geekbang.org/column/article/41913

我们对n个元素进行归并排序,需要时间T(n),

那分解成两个子数组排序的时间都是T(n/2)。

merge()函数合并的时间复杂度是O(n)。

归并排序的时间复杂度计算公式是:

T(1) = C;   n=1 时,只需要常量级的执行时间,所以表示为 C。
T(n) = 2*T(n/2) + n; n>1

如何求T(n)?

我们对T(n/2)一级一级分解:

T(n) = 2*T(n/2) + n
     = 2*(2*T(n/4) + n/2) + n = 4*T(n/4) + 2*n
     = 4*(2*T(n/8) + n/4) + 2*n = 8*T(n/8) + 3*n
     = 8*(2*T(n/16) + n/8) + 3*n = 16*T(n/16) + 4*n
     ......
     = 2^k * T(n/2^k) + k * n
     ......

可以看出:T(n) = 2^{k} T(\frac{n}{2^{k}}) + kn

\frac{n}{2^{k}} = 1时,就是最底层,也就是进行了k次之后达到了最底层。

求出k = \log n,带入T(n)的公式,求出:T(n) = Cn + n\log n,使用大O表示法:T(n) = O(nlogn);

而且归并排序的算法跟有序度无关,所以时间复杂度很稳定都是O(nLogN);

 

  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
归并排序时间复杂度可以通过递归地计子问题的时间复杂度来得到。根据引用中的公式,归并排序时间复杂度可以表示为: T(n) = 2*T(n/2) + C 其中,n代表问题的规模,T(n)表示规模为n的问题的时间复杂度,C表示常数项。 通过递归展开,我们可以得到以下等式: T(n) = 2*T(n/2) + C = 2*(2*T(n/4) + C) + C = 4*T(n/4) + 2*C = 4*(2*T(n/8) + C) + 2*C = 8*T(n/8) + 3*C = ... = 2^k * T(n/2^k) + k*C 其中,k代表递归的层数。 当子问题的规模变为1时,即n/2^k=1,解得k=logn。 将k=logn代入上式中,得到: T(n) = 2^logn * T(1) + logn*C = n * T(1) + logn*C 因为T(1)是常数,所以可以写成: T(n) = O(n) + O(logn) = O(nlogn) 所以,归并排序时间复杂度为O(nlogn)。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [归并排序算法时间复杂度](https://blog.csdn.net/crookshanks_/article/details/95355840)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [根号n段归并排序算法](https://download.csdn.net/download/weixin_43306183/13057214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值