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