堆排序混乱调整是否有必要?

2020-01-31 13:14:04 +08:00
 15921742431

构建大顶堆的时候因为元素移动造成子树混乱是否有必要再调整?大元素已经上浮,子树不调整好像也是没有关系的吧

2258 次点击
所在节点    程序员
10 条回复
creedowl
2020-01-31 13:44:20 +08:00
上浮后子树就不一定是大顶堆了啊。。建议复习数据结构堆的定义
georgetso
2020-01-31 13:48:17 +08:00
无需调整, 堆保证的是每一次输出有序, 而不是内部有序.
15921742431
2020-01-31 14:06:27 +08:00
@creedowl 我知道啊,但是我要的只是最大元素,而不是堆,我只是不知道这样做会不会有什么坑
15921742431
2020-01-31 14:07:16 +08:00
@georgetso 会有坑吗?看上去好像是没什么关系的
Licsber
2020-01-31 14:11:16 +08:00
不用调整,堆只保证顶是最大 /最小的,每次更新操作都按完全二叉树的次序(层序)来,然后再做调整。
georgetso
2020-01-31 14:27:05 +08:00
有啥坑, 你要的是输出有序, 堆能保证输出有序, 这不就结了
maggch
2020-02-01 00:21:20 +08:00
你只要最大元素你干嘛不直接遍历一下
crclz
2020-02-01 10:33:52 +08:00
有必要。
“构建大顶堆”你指的应该是第一次构建的时候(求出最大值)。

你参照这个页面: https://baike.baidu.com/item/%E5%A0%86%E6%8E%92%E5%BA%8F
crclz
2020-02-01 10:40:49 +08:00
有必要。
“构建大顶堆”你指的应该是第一次构建的时候(求出最大值)。

你参照这个页面: https://🐎baike.baidu.com/item/%E5%A0%86%E6%8E%92%E5%BA%8F

看到 c 语言代码。

我们记“条件 A”为“二叉树的每一个节点都是大于其左右子节点”。

max_heapify 方法的功能,是:若 T 的左右子树满足条件 A,那么 max_heapify 能将 T 调整为一个最大堆。
max_heapify 所需要的前提条件,就是条件 A。

所以第一次构建的时候,不断调用 max_heapify 方法的原因,就是让整个树满足条件 A。

这是纯逻辑的推理。
eastphoton
2020-02-01 21:42:10 +08:00
有必要。

大元素的上浮,不正是 对其子树进行调整( heapify )完成的结果吗?

调整和元素上浮本来就是同一操作。不调整无法保证上浮出来的是最大元素,
你怎么知道没调整的那个子树里会不会浮出来个比这个更大的元素?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/641159

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX