首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HeapSort -交换前排序

HeapSort -交换前排序
EN

Stack Overflow用户
提问于 2017-06-13 12:36:56
回答 2查看 400关注 0票数 0

我在研究算法,特别是堆排序。根据我的理解,堆排序算法包括通过首先将列表转化为最大堆来准备列表。

把我的

2、8、5、3、9、1

转到

9、8、5、3、2、1

使用堆排序,我应该用1交换9。但是,通过在最大堆后直接查看数组,我可以看到一个排序列表的递减顺序。当列表已经按递减顺序排序时,为什么需要交换?

这只是我看完后的想法:H7IdTo

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-13 12:46:43

使它成为一个堆后,它不一定按降序排序。

堆只要求每个节点比它的子节点更大(或更小,对于最小堆而言),但是没有提到子节点的顺序,也没有提到不同级别的节点之间的关系(如果其中一个不是另一个的直接后代,请参见下面的56 )。这意味着这也是一个有效的堆:

代码语言:javascript
运行
复制
     9
   /   \
  5     8
 / \   /
1   2 6

[9, 5, 8, 1, 2, 6]
票数 5
EN

Stack Overflow用户

发布于 2017-06-14 12:22:30

请回答你的问题

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

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

heapify()函数保证堆的构造。在你的例子中,它恰好是降序的。另一种情况是在对杜克灵的回答中指出的,这一问题并不是按下降的顺序进行的。

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

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

希望能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44521756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档