堆排序复杂性

时间:2016-10-04 15:31:48

标签: algorithm heap asymptotic-complexity heapsort

以下是阵列上的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)的复杂度?紧紧束缚吗?我能在哪里看到相同的数学证明?

2 个答案:

答案 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输入太难了)。