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

来自教程: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);

 

### 归并排序时间复杂度分析 归并排序是一种基于分治法的高效排序算法,其时间复杂度始终保持稳定,在最坏情况、平均情况以及最好情况下均为 \( O(n \log n) \)[^1]。 #### 分解过程中的时间消耗 在归并排序的过程中,数组被不断分割为两半,直到每个子数组仅剩下一个元素为止。这一分解操作总共会执行 \( \log_2 n \) 层次,因为每次都将当前序列长度减半[^2]。 #### 合并阶段的时间开销 当两个已排序的小规模序列需要合并成一个更大的有序序列时,此操作通过逐一比较两个序列头部元素完成。对于每一对待合并的子序列而言,假设它们各自拥有大约 \( n/4 \) 的长度,则整个合并过程中涉及约 \( n/2 \) 次对比运[^3]。因此,单层合并所需时间为线性的 \( O(n) \),而总共有 \( \log_2 n \) 层这样的合并动作发生。 综合上述两点可以得出结论:归并排序的整体运行效率由递推关系 T(n)=2T(n/2)+Θ(n) 描述,并最终得到总体时间复杂度为 \( O(n \log n) \)。 ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left_half = merge_sort(arr[:mid]) right_half = merge_sort(arr[mid:]) return merge(left_half, right_half) def merge(left, right): sorted_arr = [] i = j = 0 while i < len(left) and j < len(right): if left[i] < right[j]: sorted_arr.append(left[i]) i += 1 else: sorted_arr.append(right[j]) j += 1 sorted_arr.extend(left[i:]) sorted_arr.extend(right[j:]) return sorted_arr ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值