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

HeapSort-交换前排序

籍利
2023-03-14

我在使用算法,特别是堆排序。根据我的理解,堆排序算法包括首先将列表转换为最大堆来准备列表。

转动我的

[2, 8, 5, 3, 9, 1]


[9, 8, 5, 3, 2, 1]

和希普索尔一起,我应该用1交换9。但是通过直接在最大堆之后查看数组,我看到了一个按降序排序的列表。当列表已经按降序排序时,为什么需要交换?

这只是我看了之后的想法:https://www.youtube.com/watch?v=2DmK_H7IdTo

共有2个答案

杜嘉木
2023-03-14

对于你的问题

当列表已经按降序排序时,为什么需要交换?

根据定义:堆数据结构是一个完整的二叉树,其根大于(或小于)其子树。

heapify()函数保证了堆的构造。在您的情况下,它碰巧是按降序排列的。另一种情况是在Dukling的回答中指出的,它不是按降序排列的。

在堆排序中,在第一个heapify()调用之后,我们只知道一件事。堆的根(数组中的第一个元素)是数组中的最大元素。因此,将其移动到其位置(最后一个位置),将数组大小减少1,并对所有元素再次应用相同的步骤。

heapify()操作将是O(log n),因此是O(n log n)的总复杂度

希望有帮助!

关苗宣
2023-03-14

在将其制成堆之后,不一定按降序排序。

堆只要求每个节点都比它的子节点大(或小,对于min-heap),但没有说明子节点的顺序,也没有说明不同级别节点的关系(其中一个不是另一个的直接后代,请参阅下面的56)。这意味着这也将是一个有效的堆:

     9
   /   \
  5     8
 / \   /
1   2 6

[9, 5, 8, 1, 2, 6]
 类似资料:
  • 我想就我在教科书中发现的以下问题得到一些帮助。 现在,它说它没有描述正确的算法。但是他们说: 一段时间后,应该对数组进行排序,并证明如果输入未排序,则对数组进行排序的比较次数为O(n^3)。 另一个问题是: 验证算法是否会在O(n)时间内对数组进行排序 我真的不明白你怎么能证明这一点,因为i和j是随机的。

  • 我在实现哈夫曼算法,为此我使用了一个双链表。实现需要对列表进行排序,但仅仅交换数据是不够的——我需要交换整个节点。然而,这比我预想的要复杂一些。 我使用了这个选择排序的变体,但它会导致访问冲突错误。我假设这是因为我试图访问某个空指针,这两个条件本应阻止它。 任何帮助或建议都将不胜感激。

  • 我有一个场景,我需要执行一系列流程,每个步骤都在独立的应用程序中完成和扩展。我正在为所有交换使用主题交换。当前拓扑如下所示: P- 我们正在“版本化”队列,以处理可能影响消息结构的需求更改。绑定可能如下所示: 步骤1。exchange绑定到步骤1。v1。使用绑定键step1排队。v1 步骤1。exchange绑定到步骤1。v2。使用绑定键step1排队。v2级 还有其他与版本无关的绑定模式也使局部

  • 本文向大家介绍区分电路交换、报文交换和分组交换,包括了区分电路交换、报文交换和分组交换的使用技巧和注意事项,需要的朋友参考一下 电路切换 在这种方法中,发送方和接收方之间有一条专用路由。在通过电路交换方法确定链路之前,专用路由将继续,直到消除连接为止。 报文交换 消息交换是一种方法,其中消息作为一个整体发送并由保存和传递消息的中间集线器进行路由。在消息交换方法中,在发送方和接收方之间没有安装专用路

  • 我想比较有多少掉期和比较( 我的泡泡裙: 我的快速排序: 解决方案:

  • 我一直在尝试使用RabbitMQ,但遇到了以下问题(与此非常类似:RabbitMQ中的主题交换与直接交换)。 我需要密集地广播大约800种类型的消息(因此每种消息类型都会有很多消费者),我想知道以下哪种方法更好: > 创建一个直接交换,在该交换中,消息将使用路由密钥(消息类型名称)发送,每个消费者都将通过绑定了相应路由密钥的临时队列连接到该交换。(因为没有像“key1.key2.*”这样复杂的路由