Time complexity 为什么堆排序的时间复杂性是O(nlogn)?

Time complexity 为什么堆排序的时间复杂性是O(nlogn)?,time-complexity,pseudocode,heapsort,Time Complexity,Pseudocode,Heapsort,我试图理解不同数据结构的时间复杂性,并从堆排序开始。从我所读到的内容来看,我认为人们一致认为堆排序的时间复杂度为O(nlogn);然而,我很难理解这是怎么回事 大多数人似乎都同意heapify方法取O(logn),buildmaxheap方法取O(n),因此O(nlogn),但是为什么heapify取O(logn) 从我的角度来看,heapify似乎只是一个方法,它比较了节点的左、右节点,并根据它是最小还是最大堆正确地交换它们。为什么需要O(logn) 我想我遗漏了一些东西,如果有人能更好地向我

我试图理解不同数据结构的时间复杂性,并从堆排序开始。从我所读到的内容来看,我认为人们一致认为堆排序的时间复杂度为O(nlogn);然而,我很难理解这是怎么回事

大多数人似乎都同意heapify方法取O(logn),buildmaxheap方法取O(n),因此O(nlogn),但是为什么heapify取O(logn)

从我的角度来看,heapify似乎只是一个方法,它比较了节点的左、右节点,并根据它是最小还是最大堆正确地交换它们。为什么需要O(logn)

我想我遗漏了一些东西,如果有人能更好地向我解释,我将不胜感激


多谢各位

您缺少heapify方法末尾的递归调用

Heapify(A, i) {
   le <- left(i)
   ri <- right(i)
   if (le<=heapsize) and (A[le]>A[i])
      largest <- le
   else
      largest <- i 
   if (ri<=heapsize) and (A[ri]>A[largest])
      largest <- ri
   if (largest != i) {
      exchange A[i] <-> A[largest]
      Heapify(A, largest)
   }
}
Heapify(A,i){

le似乎您对堆排序的时间复杂性感到困惑。从未排序的数组构建maxheap确实需要O(n)时间和O(1)来弹出一个元素。但是,从堆中弹出顶部元素后,需要移动最后一个元素(a)在堆的顶部和堆中,用于维护堆属性。对于元素A,它最多会弹出日志(n)次,这是堆的高度。因此,在弹出最大值后,您最多需要日志(n)时间才能获得下一个最大值。下面是一个heapsort过程的示例

          18 

      15        8  

   7     11   1    2  

 3   6 4    9
在你弹出数字18后,你需要把数字9放在最上面,然后把数字9放在最上面

          9

      15       8

   7     11  1   2

 3   6 4
我们需要弹出9,因为9小于15

             15

          9       8

       7     11  1   2

     3   6 4
我们需要弹出9,因为9<11

          15

      11       8

   7     9  1   2

 3   6 4
9>4,这意味着heapify进程已经完成。现在您可以安全地获得下一个最大值15,而无需破坏heap属性


您需要执行heapify过程的每个数字都有n个数字。因此heapsort的时间复杂度是O(nlogn)

什么是heapify?我知道的heapify在python的标准库中,不需要O(logn)时间。您使用的是什么语言/实现?嗨,Merlyn,您可以在这里找到heapify方法的伪代码: