【发布时间】:2011-01-04 01:42:06
【问题描述】:
众所周知,堆排序的最坏情况运行时是 Ω(n lg n),但我很难理解为什么会这样。特别是,堆排序的第一步(创建一个最大堆)需要时间 Θ(n)。然后是 n 次堆删除。我明白为什么每次堆删除都需要时间 O(lg n);重新平衡堆涉及一个消泡操作,该操作在堆的高度上花费时间 O(h),并且 h = O(lg n)。但是,我不明白为什么第二步应该采用 Ω(n lg n)。似乎任何单独的堆出队都不一定会导致移动到顶部的节点一直沿树冒泡。
我的问题是 - 有没有人知道堆排序的最佳情况行为的良好下限证明?
【问题讨论】:
-
最好的情况是已经排序的列表吗? :)
-
@marcog 不是基本 DS/本科生问题的 ctheory :-/
-
基本思想是堆的大小在每一层都翻倍,所以它的元素至少有一半在最低层。(最低两层有3/4)因此,很有可能所有的“气泡”都需要在堆中非常低的位置。
标签: algorithm complexity-theory big-o heapsort lower-bound