堆(Heap)
通常看为一棵完全二叉树的数组对象
定义
分为 大顶堆 与 小顶堆 两种
大顶堆满足 h[i] > h[2 * i] && h[i] > h[2 * i + 1]
小顶堆满足 h[i] > h[2 * i] && h[i] > h[2 * i + 1]
建堆时对从第 n/2
个数到第 1
个数进行 down
操作即可 最差的时间复杂度为 O(nlogn)
代码实现
down
操作
1 | void down(int x) |
up
操作
1 | void up(int x) |
删除某个元素
1 | swap(h[x], h[sz]); |
- 删除堆顶后只需要 down 一次
- 如果想要实现删除或者更改第 k 个插入的元素则需要创建额外的两个数组建立映射,同时在 down 与 up 操作中进行映射的维护