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

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

因为每次分解都是一分为二,所以代价很低,我们把时间上的消耗记作常量 1。归并算法中比较耗时的是归并操作,也就是把两个子数组合并为大数组。从图中我们可以看出,每一层归并操作消耗的时间总和是一样的,跟要排序的数据规模有关。我们把每一层归并操作消耗的时间记作 n。

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

从归并排序的原理和递归树,可以看出来,归并排序递归树是一棵满二叉树。我们前两节中讲到,满二叉树的高度大约是 log2​n,所以,归并排序递归实现的时间复杂度就是 O(nlogn)。我这里的时间复杂度都是估算的,对树的高度的计算也没有那么精确,但是这并不影响复杂度的计算结果。

总结

  • 归并排序的时间复杂读为nlogn,每一行时间复杂度O(n) 然后二叉树高度log(n)

参考

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

归并排序的时间复杂度相关推荐

  1. 排序算法-归并排序的时间复杂度分析

    归并排序,其实就是递归+合并. 归并排序将数组取中间分为两部分,两个子数组分别各自再从中间分为两个子数组,一直分下去直到不能再分.分完之后,再按照子数组大小合并为为一个有序数组,然后层层向上合并,直到 ...

  2. 关于快速排序和归并排序的时间复杂度分析

    目录 一.快排时间复杂度分析 二.归并排序时间复杂度分析 三.写在最后 一.快排时间复杂度分析 快速排序的时间复杂度在O(nlogn)~ O(n^2)之间,下面我分别分析这两种情况: (一)快速排序的 ...

  3. 归并排序的时间复杂度为什么为nlogn

    归并排序的递归过程如下,该递归树的高度为log2n(计算过程:假设待排序的数组元素个数为n,设高度为x,x意味着n个元素需要连续二分x次才剩下1个元素,即n/2^x=1,x=log2n),每一层的总比 ...

  4. 二路归并排序及时间复杂度分析

    序言 二路归并排序是一种效率极高的递归排序,将数组A化为有序数组时间复杂度为O(nlogn). 思想 二路归并排序分为拆分数组以及合并两个操作. 切分(自上而下)时间复杂度2*T(n/2) 每次从数组 ...

  5. 912. 排序数组——归并排序Java时间复杂度空间复杂度稳定性分析

    目录 1.题目 2.思路 归并排序--nlogn 思想--递归 代码 时间复杂度--O(nlogn) 空间复杂度--O(n) 稳定性--稳定 3.结果 1.题目 2.思路 这个题可以作为练习手写各种排 ...

  6. 使用递归实现归并排序及归并排序的时间复杂度

    1.什么是递归:方法调用其本身. 2.怎么样去实现 需要写递归表达式,递归表达式分为: 1)递归出口 2)递归关系 例1:斐波那契数:1,1,2,3,5,8,13........n,求第n 项 1)递 ...

  7. 排序算法之 归并排序 及其时间复杂度和空间复杂度

    在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序:归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数 ...

  8. 归并排序 快速排序 时间复杂度分析 (基本递归时间复杂度分析)

    归并排序 归并排序:利用分治的思想,先排左边一半,再排右边一半,最后再将两边有序的合并起来. 时间复杂度: 用T(n)T(n)T(n)表示排大小为nnn的数组的时间:T(n)=2T(n/2)+nT(1 ...

  9. 归并排序执行次数_归并排序过程、时间复杂度分析及改进

    前言 上一篇文章,介绍过第一种基于分治策略的排序算法--快速排序.接下来我们来讨论另一种基于分治策略的排序算法,归并排序.归并排序也被认为是一种时间复杂度最优的算法,我们还是按照基本过程,代码,最坏时 ...

最新文章

  1. windows ssh secure shell设置初始窗口大小
  2. 阿里云Kubernetes CSI实践—NAS动态存储卷使用
  3. 1.3编程基础之算术表达式与顺序执行 02 计算(a+b)*c的值
  4. 【论文阅读】医疗影像分割中的半监督学习Semi-supervised
  5. springboot中spring.profiles.active来引入多个properties文件 Springboot获取容器中对象
  6. concurrenthashmap为什么是线程安全_为什么 StringBuilder 不是线程安全的?
  7. 【ICML2019】Set Transformer:置换不变的注意力神经网络框架
  8. mac定时备份mysql_定时备份mysql数据库
  9. vbs教程《变量使用》
  10. 周杰伦录音室专辑名字整理,时间倒数
  11. 扫描枪识别条码为乱码
  12. seajs学习(1)----什么是系统
  13. 微信JS-SDK的PHP demo页面,解决Internal error 500错误
  14. mysql 提升tps_MYSQL的TPS优化
  15. 3.7 Docker最新入门教程-Docker入门-多容器应用
  16. 艾宾浩斯记忆曲线——定期、及时复习的重要性
  17. 韩国计算机硕士累吗,在韩国读研究生有多心累...
  18. objectDestructuringEmpty.js:2 Uncaught TypeError: Cannot destructure undefined
  19. 俄17岁少年推出网聊新招
  20. Codec2之建造者模式

热门文章

  1. python程序员工资高吗_Python程序员必备:EDA数据分析神器,老板疯狂加工资
  2. model存数据_数据库内核杂谈 存储
  3. CSDN写博客图片的放大、缩小、去水印、居中
  4. go 类型断言_深入理解Go的interface内部执行原理
  5. php 设计模式系列,一看就懂系列之 php设计模式(一)-Go语言中文社区
  6. java判断是否失效_java – 如何在输入有效之前检查无效输入和循环?
  7. php 正则提取连续字母,PHP匹配连续的数字或字母的正则表达式
  8. java接口多态的变量能_「JAVA」多态的灵魂,面向接口的程序设计,这才是你该懂得的接口(interface)...
  9. c语言编译程序的软件下载,c语言编译器(wintc)
  10. mysql双机热备 读写分离_轻松搭建MySQL主从复制、读写分离双机热备)