堆排序 - 算法学习

47 阅读1分钟

描述:对一个数值数组进行堆排序,比如:[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. 构造堆,满足堆性质
  2. 从第一个非叶子节点开始,比较左右子节点,取较大值代替此节点
  3. 从第一个非叶子节点的索引减一,不断重复第二步,最终堆顶即最大值
  4. 将堆顶的索引和数组最后一个元素值进行交换
  5. 重复1至4步骤,最终得到有序序列

参考资料

Hollis 大神的《2023全新Java面试宝典课程,八股文学习资料》