以下是阵列上的HEAPSORT伪代码
HEAPSORT(A)
BUILD-MAX-HEAP(A)
for i = A.length downto 2
exchange A[1] with A[i]
A.heapsize = A.heapsize - 1
MAX-HEAPIFY(A,1)
我很清楚BUILD-MAX-HEAP的复杂度为O(n),MAX-HEAPIFY的复杂度为O(h),其中h是堆的高度,其最大值为logn。
我完全不了解的是HeapSort为什么会有nlogn的复杂性。据我所知,每次MAX-HEAPIFY都有n次迭代。但是他的MAX-HEAPIFY调用在每次迭代中获得了缩小大小的HEAP。那么每次迭代怎么能有O(lgn)的复杂度?紧紧束缚吗?我能在哪里看到相同的数学证明?
答案 0 :(得分:3)
Big O符号表示上部绑定。正如你所说:
MAX-HEAPIFY的复杂度为O(h),其中h是堆的高度,其最大值为log n。
我们不关心堆是否变小。我们知道最坏,堆的高度为 log n 。我们这样做 n 次,因此 n log n 。
答案 1 :(得分:2)
观察
log 1 + log 2 + log 3 + ... + log n
= log (1 * 2 * 3 * ... * n)
= log n!
现在,通过斯特林的近似,
n! ≈ sqrt(2πn) * (n/e)n
所以:
log n! ≈ n * (log n/e) = n * (log n - 1) = n log n - n
是O(n log n),因为n log n
项支配n
项(以及我遗漏的O(log n)项,因为用MathJax输入太难了)。