algorithm - 为什么heapify会交换堆顶元素和堆底元素?

标签 algorithm heapsort

在最大堆(假设它由数组表示)中,堆的顶部(即堆中的最大值)与数组中的最后一个元素(即堆中的最小值之一)交换),最后一个元素被移除,然后新的堆顶元素与其他值交换以回到其正确的位置。

相反,为什么不只是删除顶部元素,然后其他元素可以“填充”堆?

最佳答案

堆的一个关键属性是底层二叉树是一棵完整二叉树(即除了最后一层之外的每一层都必须完全“填充”)。这是为了使堆具有 O(lg N) 操作,因为我们只需要在每个 O(lg N) 级别修改一个元素。我们来看一个例子

    10
   /  \
  8    7
 / \  / \
5  6  4  3

如果我们按照您的方法“填充”我们得到的堆

     8
   /   \
  6     7
 / \   / \
5  ?   4  3

树不再是完整的二叉树,因为在 ? 处有一个“洞”。因为我们不知道树是否完整,所以我们不知道树的高度,所以我们不能保证 O(lg N) 操作。

这就是为什么我们取出堆中的最后一个元素,将其放在顶部然后将其打乱 - 以保持完整的二叉树属性。

关于algorithm - 为什么heapify会交换堆顶元素和堆底元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11488227/

相关文章:

java - 实现堆排序的正确方法是什么?

c - Heapsort - Percolate-down/Shift-down 和 Heapify 操作之间的区别/关系是什么?

c - 堆排序适用于字符串,但不适用于整数

algorithm - 堆排序的辅助空间和空间复杂度的区别?

java - 如何计算此解决方案的时间和空间复杂度?

algorithm - 为什么 Merge 排序空间复杂度为 O(n)?

algorithm - 需要算法将不同大小的文件分组为大致相等的 block

algorithm - 交换 hashmap 的 Key 和 Value

arrays - 给定一个包含 n 个整数的列表,找到大于 X 的最小子集和

由于输入数组尺寸过大,C 程序崩溃(段错误)。如何在不使用 static/global/malloc 的情况下防止它?