码迷,mamicode.com
首页 > 编程语言 > 详细

第6章 堆排序

时间:2015-01-15 16:14:27      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:算法导论答案

6.4-5 在所有元素都不同的情况下,HEAPSORT的时间复杂度是Ω(nlgn)

证明:要证明这一点其实不难,只需直觉上理解——虽然堆序不“完整”,但也能在一定程度上确定大小关系,比如较小的元素多半高度很低(接近底层)。

首先进行一个粗略的计算(元素都不同):

堆中高度为0(即最底层)的节点数为总数的一半 n/2。那这些元素在整个元素集中大小位置是如何的呢:

先把这 n/2 个节点排好序,得到递增的序列(这里考虑最大堆),然后再来考虑在整个元素集中的大小位置。

技术分享

其中第一大的在整个堆中最大也只能排到第 lgn 大,因为它有 lgn 个祖先,最小的在整个堆中必然也是最小的,因为最小值高度只能为0。

上面一句其实不重要,重要的是这 n/2 个元素在整个元素集中的大概分布。

上面第 2k + 1 大的元素在整个元素集中最大只能排到  lgn + 2k + 1 大,因为相隔2的元素必然有一个不同的祖先,而这个祖先必然存在较小的那个元素前面。

所以通过贪心构造出一个分布:

技术分享

因为内部节点也有 n/2 个,所以未分配的祖先有 n/4,所以最底层元素大小位置排在 n/2 大之后的元素有 n/6个,考虑在排在 n/2 大之后是因为,经过 n/2 次弹出最小值后,这些排在后面的还是会留在堆中。

光是这 n/6 个元素构成的二叉堆,所有节点的深度(从最底层抽上去自己再降下来走的路径)之和都为 n/6lg(n/6)。

所以对于整个堆来讲,这些节点的深度之和一定不小于 n/6lg(n/6),由于后面的结果是几何减少的,加出来也差不多,就不算了。

也许你会觉得万一一个节点降到最底层,从而有的最底层节点没有从根节点下降会使得证明不成立。

其实是不会的,因为如果发生那种情况只要把没有被抽取的那个节点的深度想成 lgn (这一值比估计值还大)就行了,因为发生这种情况,另一个元素就相当于“替”它下降了。

所以HEAPSORT的时间复杂度是Ω(nlgn)。


第6章 堆排序

标签:算法导论答案

原文地址:http://blog.csdn.net/u010383982/article/details/42740791

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!