1. 堆的定义
堆是一种基于完全二叉树的数据结构。每个父节点都大于等于(或者小于等于)它的两个子节点的完全二叉树就是堆。
- 大堆:大于等于的情况称为大根堆。
- 小堆:小于等于的情况称为小根堆。
2. 堆的建立
因为堆是完全二叉树,所以可以用数组来存储。比如父节点的下标为i,那么它的左孩子为(i + 1)/ 2 + 1,右孩子为(i + 1)/ 2 + 2;如果某叶子节点的下标为i,则它的父亲节点为(i - 1)/ 2。
- 这里讲解向上调整建大堆,从最后一个节点出发,与父节点比较,如果比父亲大,则交换,直至根节点。
void AdjustDown(std::vector<int> &v){
int r = v.size() - 1;
int key = v[r];
int parent = (r - 1) / 2;
while(parent >= 0 && key < v[parent]){
std::swap(v[parent],v[r]);
r = parent;
parent = (r - 1) / 2;
key = v[r];
}
}
3. 堆排序
以大堆为例子,从最后一个元素出发,与第一个元素交换,然后进行调整,直至根节点。