天天看点

归并排序的时间复杂度

归并排序算法你还记得吧?它的递归实现代码非常简洁。现在我们就借助归并排序来看看,如何用递归树,来分析递归代码的时间复杂度。

归并排序每次会将数据规模一分为二。我们把归并排序画成递归树,就是下面这个样子:

归并排序的时间复杂度

因为每次分解都是一分为二,所以代价很低,我们把时间上的消耗记作常量 1。

归并算法中比较耗时的是归并操作,也就是把两个子数组合并为大数组

。从图中我们可以看出,每一层归并操作消耗的时间总和是一样的,跟要排序的数据规模有关。我们把每一层归并操作消耗的时间记作 n。

现在,我们只需要知道这棵树的高度 h,用高度 h 乘以每一层的时间消耗 n,就可以得到总的时间复杂度 O(n∗h)。

从归并排序的原理和递归树,可以看出来,归并排序递归树是一棵满二叉树。我们前两节中讲到,满二叉树的高度大约是 log2​n,所以,

归并排序递归实现的时间复杂度就是 O(nlogn)

。我这里的时间复杂度都是估算的,对树的高度的计算也没有那么精确,但是这并不影响复杂度的计算结果。

总结

  • 归并排序的时间复杂读为

    nlogn

    ,每一行时间复杂度O(n) 然后二叉树高度log(n)

参考

归并排序图解_鸭梨的博客-CSDN博客

继续阅读