堆排序复杂度

Heap Sort Complexity

下面是数组上 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 是堆的高度,其最大值为登录。

完全不明白的是为什么HeapSort的复杂度是nlogn。我知道我们有 n 次迭代,每次迭代都是 MAX-HEAPIFY。但是他的 MAX-HEAPIFY 调用在每次迭代中都会得到一个大小递减的堆。那么每次迭代如何具有 O(lgn) 的复杂性?绑定的严不严?我在哪里可以看到相同的数学证明?

大 O 表示法表示 上限 界限。正如你所说:

MAX-HEAPIFY has a complexity of O(h) where h is the height of the heap which has a max value of log n.

我们不关心堆是否变小。我们知道在最坏的情况下,堆的高度为log n。我们这样做 n 次,因此 n log n.

注意

log 1 + log 2 + log 3 + ... + log n
= log (1 * 2 * 3 * ... * n)
= log n!

现在,根据斯特林的近似值,

n! ≈ sqrt(2πn) * (n/e)<sup>n</sup>

所以:

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 太难打字了).