什么是堆
- 堆是一个完全二叉树
tips:完全二叉树的特征是除最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列
- 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值
- 大顶堆
- 小顶堆
如何实现一个堆
- 如何存储一个堆
数组存储,.....数组存储的优势?
- 堆支持哪些操作?
2.1 往堆里插入一个元素
插入元素后,需继续满足堆的两个特性,这其中就有个堆化(heapify)的过程
堆化方向:从下往上、从上往下
堆化过程:顺着节点所在的路径,从下或者从上,对比,然后交互
2.2 删除堆顶元素
往堆中插入一个元素和删除堆顶元素的时间复杂度都是O(log n)
如何基于堆实现排序?
堆排序,时间复杂度O(n log n),原地排序算法
- 建堆
从后往前处理数组,每个数据都是从上往下堆化,建堆的时间复杂度O(n) - 排序
移除堆顶元素,把下标为n的元素放堆顶,再通过堆化的方法,将剩下的n-1个元素重新构建成堆。
堆排序的时间复杂度是O(n log n)
为什么快速排序要比堆排序性能好?
- 堆排序数据访问的方式没有快速排序友好
- 同样数据,排序过程中,堆排序算法的数据交换次数要多于快速排序