堆
- 堆必须是完全二叉树
大顶堆
-
大顶堆要求所有父节点值大于子节点
-
已知子节点index找父节点:parent = (child - 1)/ 2
-
已知父节点index找子节点:child1 = parent * 2 + 1,child2 = parent * 2 + 2
-
上浮操作:从子节点向上,不需要循环遍历
-
下沉操作:从父节点向下,需要循环遍历
-
初始化:需要从最后的父节点开始到根节点,进行下沉
-
插入:插在最后,上浮
-
删除:根节点和最后的节点交换,删除最后的,再在新的根节点位置开始下沉
堆排序
大顶堆顶堆,每次根和最后元素换位置,然后在新的根节点位置开始下沉。
像是每次删除最大的元素,然后重新调整为大顶堆。
- 平均时间复杂度:O(nlogn)
- 最佳时间复杂度:O(nlogn)
- 最差时间复杂度:O(nlogn)
- 稳定性:不稳定
堆排序也是一种选择排序法,不适合较少的数量进行排序。
堆排序是选择排序的优化,选择排序需要在未排定的部分里通过「打擂台」的方式选出最大的元素(复杂度 O(N)O(N)),而「堆排序」就把未排定的部分构建成一个「堆」,这样就能以 O(logN) 的方式选出最大元素;