我已经读过算法来删除堆的根元素。 1.使用堆的最后一个元素交换根元素。 2.然后从根元素向下堆积(向下移动)。
在其他几个地方,我发现它们从最后一个元素的父元素向上堆积。(即,在这里检查deleteTop()函数http://www.geeksforgeeks.org/archives/14873)因此与正确的方法混淆:-(这是否有所不同关于情况或文章本身是错的?
答案 0 :(得分:1)
deleteTop()
的代码错误。
给出这个max-heap并运行deleteTop()
:
10
8 7
5 4 3 2
||
||
\/
2
8 7
5 4 3 10
||
||
\/
7
8 2
5 4 3 10
由于2<(3和10)
,所产生的堆是错误的答案 1 :(得分:0)
我认为堆排序概念只是识别最大或最小的元素并将其从堆中删除......你可以采用任何一种方式来实现它,这是算法的不同实现。
答案 2 :(得分:0)
在其他几个地方,我发现它们从最后一个堆积起来 element的父对象。(即,在这里检查deleteTop()函数 http://www.geeksforgeeks.org/archives/14873)
heapify()
的内联评论明确表示实施已针对中间流媒体问题进行了调整;但是,在通用堆结构实现中,heapify()
会崩溃。有关堆实现和中值流问题的详细说明,请参阅this算法讲座。
答案 3 :(得分:0)
基本思想是首先创建最大堆。
堆不过是对数组元素的排序,该数组元素遵循a [i]> a [2i + 1]和a [2i + 2],因此您从叶节点开始交换,因此向上移动。
但是在建立最大堆时,您也必须向下移动,阅读下面的答案,我之前也有疑问
Giving a test case where heap sort from Introduction to Algorithm fails
完成最大堆或最小堆后,与最后一个元素交换,以便将最大元素置于其最后一个排序位置。
现在,因为它是最大堆,所以在每个索引处都遵循条件a [i]> a [2i + 1]和a [2i + 2],但是在第0个位置,我们不确定其是否仍遵循该条件,因为我们已从最后一个位置交换了位置,并且位于第0位的新元素可以大于或小于其子元素。
因此,如果它较小,我们将交换,然后继续向下移动直到满足该堆属性,然后我们以n-1位置交换并继续。
因此,为回答您的问题,在建立最大堆时,我们将向上移动,并且也必须向下移动,以防交换导致堆属性冲突。
但是一旦创建了最大堆,并在该过程中与最后一个元素交换,我们就向下移动,因为除了第0个位置以外,每个位置都满足堆属性。