HeapSort中已经降序排序的数组的时间复杂度

时间:2018-01-19 05:11:57

标签: algorithm sorting time-complexity analysis heapsort

考虑一个已经按降序排序的数组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))?因为堆大小随着每次迭代而减少?

1 个答案:

答案 0 :(得分:2)

n..1的对数总和不是log(n)而是nlogn(看斯特林公式)

从任意数组构建的经典堆是O(n)进程 - 而不是O(nlogn)