【问题标题】:Heap Sort - max heap堆排序 - 最大堆
【发布时间】:2017-09-07 10:39:16
【问题描述】:

我有一个 [17,98,89,42,67,54,89,25,38] 中的数字列表,它将从左到右插入一个空堆中。结果堆会是什么?

【问题讨论】:

  • 我投票结束这个问题,因为它太具体了,对其他读者没有用。
  • 我认为您可以在 Wiki 中获得所需的全部信息:en.wikipedia.org/wiki/Heapsort
  • homeworkoverflow.com ?
  • 我知道什么是堆排序。我只是想知道是否存在任何特殊类型的堆排序,其中对于任何给定节点,左孩子必须低于右孩子。我的查询与此有关。 @Thilo
  • 没有左孩子必须小于右孩子的特殊类型的二叉堆。如果您尝试执行该规则,那么您的堆维护成本会非常高,并且您无法满足 insertremove-max的 O(log n) 保证> 操作。对于您的主要问题,拿一张纸和一支铅笔,手动完成插入操作,在每一步之后绘制树。大约需要 10 分钟。

标签: sorting max heap heapsort


【解决方案1】:

虽然这不是堆排序算法(使用堆对数据集进行排序),但构建堆确实需要一些比较工作以确保它仍然是堆(你想要一个最大堆,所以所有的孩子都更少比他们的父母)。构建最大堆的方法是将最新的元素放在下一个可用位置(树中最左边的位置未填充在最深的行中,或者从最左边的位置开始新的行)。一旦一个元素被插入,如果它比它的父元素大,它就会与它的父元素交换,直到它成为树的根或者找到一个比它自己大的父元素。这样做直到所有元素都被插入,事实上,它以最大元素作为根。

重要的是要注意,对于最小堆,最小元素是根,所以不是所有的父母都比他们的孩子大,而是所有的孩子都比他们的父母大。在构建最小堆时,仍然将新顶点添加到同一位置,但如果子节点小于父节点而不是更多,则将新子节点与父节点切换。

已附加了两个图像以及生成的最大和最小堆。请注意,89a 对应于第一个 89 和 89b 对应于秒,为了澄清的目的。 Max HeapMin Heap

【讨论】:

    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 2011-03-07
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 2018-08-28
    相关资源
    最近更新 更多