从最小或最大堆中删除根元素的算法

时间:2012-08-09 16:36:56

标签: algorithm sorting heap binary-tree

我已经读过算法来删除堆的根元素。 1.使用堆的最后一个元素交换根元素。 2.然后从根元素向下堆积(向下移动)。

在其他几个地方,我发现它们从最后一个元素的父元素向上堆积。(即,在这里检查deleteTop()函数http://www.geeksforgeeks.org/archives/14873)因此与正确的方法混淆:-(这是否有所不同关于情况或文章本身是错的?

4 个答案:

答案 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个位置以外,每个位置都满足堆属性。

相关问题