算法导论6.4-4 所有元素均不相同时,最好情况下,堆排序复杂度为Ω(nlgn)
来源:互联网 发布:abb码垛指令编程视频 编辑:程序博客网 时间:2024/05/16 13:41
即证明堆排序复杂度不会小于nlgn!
考虑堆排序的过程,弹出当前最大元素后,将最长路径序列往上拉一层,再将末尾元素放置到最长路径序列的合适位置。
可以看到,由于元素互不相同,除max-heapify的叶子结点外,其余元素均一层一层向根结点靠拢。
假设非叶子结点与根结点距离为h,则当此元素弹出时(已经被排好序),恰好被移动h次,序号为i的非叶子结点,与根结点距离为[lgi](以下论证忽略取整函数)
如果能证明有一半以上的结点,在max-heapify 中均没有作过叶子结点,则这些结点的移动总次数 S > lg1 + lg2 + ... +lg(n/2) ≈ (n/2) lg(n/2) = (n/2)lgn - n/2 ,
于是得到堆排序时间复杂度为Ω(nlgn)
为简单起见,考虑满二叉树,设最底层叶子结点个数为2^(h+1),总结点数为2^(h+2) - 1,则排序好2^(h+1) 个元素后,最多有(2^h个)的叶子结点已经排好序。
反证法,假设有>=2^h+1个叶子结点已经排好序,则原有叶子结点的所有父结点均已排好序。根据抽屉原理,这些叶子结点包括了根结点某个子树的所有叶子,
而且还包括另一子树的至少一个叶子结点,根结点某一个子树共有2^(h+1)-1个结点,另一个子树至少有lg(n)个结点已经排好序,而 2^(h+1)-1 + lg(n) > 2^(h+1),矛盾。
因此对于满二叉树,最底层叶子结点个数全部处理一次后,总共排好了2^(h+1)个元素,其中至少有2^h个元素在max-heapify 中不是叶子结点,这些结点需要一层一层的移动到根结点才能排好序。
即一次处理2^(h+1)个元素后,至少有2^h个元素在max-heapify 中不是叶子结点,使用数学归纳,当全部处理完n个元素后,至少有n/2个元素在max-heapify 中不是叶子结点,于是命题得证
- 算法导论6.4-4 所有元素均不相同时,最好情况下,堆排序复杂度为Ω(nlgn)
- 排序算法:实现,平均复杂度,最好(坏)情况复杂度,稳定性
- 判断序列中是否存在两个元素之和为x,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现
- 复杂度为nlgn的求幂算法
- 各排序算法最好最坏平均情况下的时间复杂度
- 算法导论中的堆排序算法时间复杂度推导
- [算法导论] 6.4堆排序
- 二分法实现插入排序,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现
- 算法导论7-2,针对相同元素的快速排序
- 分治算法;随机化划分函数;快速排序;线性时间选择第K小元素;快速排序平均时间复杂度nlgn;
- 最坏情况快速排序的运行时间为Ο(nlgn)的算法
- 归并排序;分治算法;复杂度nlgn;附加逆序数算法;
- 作业:递归实现插入排序和在o(nlgn)时间复杂度内寻找和为定值的两个元素
- 快速排序算法在平均情况下的时间复杂度为 求详解
- 算法导论 堆排序
- 算法导论--堆排序
- 【算法导论】 堆排序
- 算法导论-----堆排序
- 第八周项目1
- 旅游保险App(iOS)界面设计
- 重学C++ vector介绍
- Android 自动化测试工具
- AS 3.0 中加载过程调度事件和加载完成调度事件
- 算法导论6.4-4 所有元素均不相同时,最好情况下,堆排序复杂度为Ω(nlgn)
- 一份劳动一份收获啊
- 黑马程序员_java中的面相对象1
- 使用NSStream来实现Socket
- 一念成佛,一念成魔
- const定义的全局变量不能被其他文件访问,必须加extern 才能被访问吗?
- idhttp自动登录网站
- + - * /运算符扩展
- 照片换背景色(Photoshop工具)