数据结构堆、大顶堆、堆排序介绍

238 阅读1分钟

  1. 堆必须是完全二叉树

大顶堆

  1. 大顶堆要求所有父节点值大于子节点

  2. 已知子节点index找父节点:parent = (child - 1)/ 2

  3. 已知父节点index找子节点:child1 = parent * 2 + 1,child2 = parent * 2 + 2

  4. 上浮操作:从子节点向上,不需要循环遍历

  5. 下沉操作:从父节点向下,需要循环遍历

  6. 初始化:需要从最后的父节点开始到根节点,进行下沉

  7. 插入:插在最后,上浮

  8. 删除:根节点和最后的节点交换,删除最后的,再在新的根节点位置开始下沉

堆排序

大顶堆顶堆,每次根和最后元素换位置,然后在新的根节点位置开始下沉。

像是每次删除最大的元素,然后重新调整为大顶堆。

  • 平均时间复杂度:O(nlogn)
  • 最佳时间复杂度:O(nlogn)
  • 最差时间复杂度:O(nlogn)
  • 稳定性:不稳定

堆排序也是一种选择排序法,不适合较少的数量进行排序。

堆排序是选择排序的优化,选择排序需要在未排定的部分里通过「打擂台」的方式选出最大的元素(复杂度 O(N)O(N)),而「堆排序」就把未排定的部分构建成一个「堆」,这样就能以 O(logN) 的方式选出最大元素