建堆的时间复杂度 因为堆是完全二叉树,而满二叉树也是完全二叉树。此处为了简化,将采用满二叉树来证明。(时间复杂度本来看的就是近似值,所以多几个节点不会影响最终结果):
假设树的高度为
文章图片
:
文章图片
第则需要移动节点总的移动步数为:![]()
文章图片
层:![]()
文章图片
个节点,需要向下移动![]()
文章图片
层
第![]()
文章图片
层:![]()
文章图片
个节点,需要向下移动![]()
文章图片
层
第![]()
文章图片
层:![]()
文章图片
个节点,需要向下移动![]()
文章图片
层
第![]()
文章图片
层:![]()
文章图片
个节点,需要向下移动![]()
文章图片
层
……
第![]()
文章图片
层:![]()
文章图片
个节点,需要向下移动![]()
文章图片
层
![《C语言杂俎》|证明堆排序的时间复杂度](https://img.it610.com/image/info8/94ac0923c2fb4f78b66038f8aec81c58.gif)
文章图片
①
![《C语言杂俎》|证明堆排序的时间复杂度](https://img.it610.com/image/info8/8b5998dac3f24034976926cca6420c41.gif)
文章图片
②
② - ① 错位相减:
![《C语言杂俎》|证明堆排序的时间复杂度](https://img.it610.com/image/info8/d0c8fcbf4677427a8560249567cd9e7a.gif)
文章图片
![《C语言杂俎》|证明堆排序的时间复杂度](https://img.it610.com/image/info8/11935f52370240318ea3f4d5a9144654.gif)
文章图片
![《C语言杂俎》|证明堆排序的时间复杂度](https://img.it610.com/image/info8/b8c54f1d51b54b83a385995611bee8de.gif)
文章图片
![《C语言杂俎》|证明堆排序的时间复杂度](https://img.it610.com/image/info8/c5327b2ab9ea445bb895a2ae6f031077.gif)
文章图片
![《C语言杂俎》|证明堆排序的时间复杂度](https://img.it610.com/image/info8/a3f4201aceb841789e80e190418241da.gif)
文章图片
因此,建堆的时间复杂度为
![《C语言杂俎》|证明堆排序的时间复杂度](https://img.it610.com/image/info8/ea433f6449284af4940c21a8c994dfba.gif)
文章图片
【《C语言杂俎》|证明堆排序的时间复杂度】
推荐阅读
- 指针|【发际线大作战】C++学习记录之用户自定义数据类型
- C++|set、map及AVL树
- 蓝桥杯|2018第九届蓝桥杯国赛JAVA B组真题解析(带源码及解析)
- 算法与数据结构的碰撞经典汇总|四平方和 剪枝+枚举 【蓝桥真题】(c++)
- Java每日一题|【蓝桥Java每日一题】——14.球会落何处(有趣模拟题)
- 蓝桥真题|【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可
- 算法|开学季——经典计算机教材带你起飞!
- python|python数据结构-链表
- python|python 排序算法