考虑一个已经按降序排序的数组A [n]。堆已经构建好了。现在考虑我们用A [heap.size]交换A [1](数组索引以1开头)的循环。这是伪代码:
Build-Max-Heap(A) //Already done
while (i > 0) {
swap(A[1] with A[heap_size]
heap_size = heap_size - 1
Max-Heapify(A,1) //Takes lg(A.heap_size) time to float the 1st element down to it's respective position
}
我们在元素1上调用Max-Heapify来恢复堆属性,允许它向下浮动到它的适当位置。我们知道Max-Heapify将花费c lg(n)时间。所以,不应该循环取c (lg(n)+ lg(n-1)+ .... + lg(1))= Theta(log(n))时间而不是jut Theta(n * lg(n))?因为堆大小随着每次迭代而减少?
答案 0 :(得分:2)
n..1
的对数总和不是log(n)
而是nlogn
(看斯特林公式)
从任意数组构建的经典堆是O(n)进程 - 而不是O(nlogn)