它是如何工作的?
Coddy 堆排序:数据结构与算法系列 课程的第 3 课,共 9 课。
二叉堆存储在普通数组中。对于索引为 i(从 0 开始)的节点,它的子节点位于 2*i + 1 和 2*i + 2。这种索引方式正是树能够存储在数组中的关键。
分步过程:
- 构建最大堆:重新排列数组,使每个父节点都 >= 它的子节点。最大值会位于索引 0 处。
- 取出最大值:将根节点(最大值)与堆中的最后一个元素交换,然后将堆的大小缩小 1。这样,最大值就被放在末尾的最终排序位置上。
- 通过向下筛选来修复:新的根节点可能不在正确位置,因此要将它向下筛选(与较大的子节点交换,并重复此操作),直到堆属性再次成立。
- 重复此过程,直到堆为空。此时数组已按升序排列。
以 [4, 10, 3, 5, 1] 为例:
- 构建最大堆:[10, 5, 3, 4, 1]。
- 将根节点 10 交换到末尾并向下筛选,然后对 5、4、3 重复此操作。
- 结果:[1, 3, 4, 5, 10]。
亲手试试
这节课没有代码挑战。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
堆排序:数据结构与算法系列中的所有课
自己练习: C 在线编译器