描述:对一个数值数组进行堆排序,比如:[2,5,3,1] -> [1,2,3,4]
解法:构造大顶堆,取堆顶值,重复构造堆,即可将所有元素排序
堆性质:
- 二叉树
- 索引 i 的节点的左子节点的索引是 2 * i + 1
- 索引 i 的节点的右子节点的索引是 2 * i + 2
- 索引 i 的节点的父节点的索引是 floor(i-1) / 2
- 第一个非叶子节点索引是 arr.length / 2 - 1
- 构造堆,满足堆性质
- 从第一个非叶子节点开始,比较左右子节点,取较大值代替此节点
- 从第一个非叶子节点的索引减一,不断重复第二步,最终堆顶即最大值
- 将堆顶的索引和数组最后一个元素值进行交换
- 重复1至4步骤,最终得到有序序列
参考资料
Hollis 大神的《2023全新Java面试宝典课程,八股文学习资料》