当前位置: 首页 > 知识库问答 >
问题:

堆排序,要使用的最小堆还是最大堆?

商天逸
2023-03-14

对于堆排序,如果我们想按升序对数组排序,那么应该在最大堆还是最小堆中转换堆?

共有1个答案

孔皓
2023-03-14

任何一种方法都可以奏效。通常,您会使用最大堆排序,以便最大的元素位于数组的最左侧。这样,当您退出队列并从堆中移除元素以将它们放置在其最终位置时,您可以将它们从右向左(按降序)放置在阵列的远端,而无需踩到其他堆元素的顶部。

原则上,您也可以构建一个最小堆,最小元素位于最右侧,然后将小元素出列并将其移动到最左侧,尽管我以前从未见过这样做。

 类似资料:
  • 我只是想看看我是否理解教授和在线资源所说的话。 对于heapSort算法,第一个元素的索引从0开始。 对于最大堆,如果子堆大于父堆,则percolate down应将最大子堆与其父堆交换,例如(这是用于赋值,因此我尝试发布尽可能少的代码): 所以最后,最大元素应该在索引0处。 如果这是正确的,我不理解的是heapSort实现: 最大堆中的渗滤层不应该将最大的元素放在索引0处吗?在这种情况下,为什么

  • 我在[17,98,89,42,67,54,89,25,38]中有一个数字列表,从左到右插入到一个空堆中。生成的堆是什么?

  • 我注意到一件非常奇怪的事情。 读完这节课后,我在C中实现了一些堆排序代码。 代码如下。 奇怪的是,对我来说,构建min堆-提取min(或在构建min堆后在根目录下执行min-heapify)应该按升序进行。然而,在执行此代码并打印出结果向量后,我得到: 在试图弄清楚发生了什么的时候,我改变了 到 最终选择较大(或最大)的父节点和子节点,得到的向量为: 我是否做错了什么,或者我对堆/堆排序的理解不清

  • 我一直想知道为什么STL优先级队列默认使用最大堆而不是最小堆。我想到的两个明显的用例是寻路(Dijkstra)和构建霍夫曼代码。这两种算法都需要首先拉取最小元素。由于排序(std::sort)默认使用升序,我想知道priority_queue背后的设计原因是什么,因为我非常喜欢默认的最小堆。

  • 本文向大家介绍C语言实现基于最大堆和最小堆的堆排序算法示例,包括了C语言实现基于最大堆和最小堆的堆排序算法示例的使用技巧和注意事项,需要的朋友参考一下 堆定义 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2](小顶堆)或者:Key[i]>=Key[2i+1]&&key>=key[2i+2](大顶堆) 即任何一非叶节点的关

  • 问题内容: 您是否知道一个流行的库(Apache,Google等),该库具有可靠的最小- 最大堆Java实现,即允许在其中查看其最小值和最大值并删除其中的元素的堆? 问题答案: 番石榴:。