简介

可以称作完全二叉树,数组的[t]位置的左儿子和右儿子对应的位置分别为[2t]和[2t + 1],父亲节点的位置为[t / 2]

大根堆

父节点中的值大于两个子节点中的值,根节点最大的堆称为大根堆

小根堆

父节点中的值小于两个子节点中的值,根节点最小的堆称为小根堆

插入操作

1
2
3
4
5
6
7
8
9
10
11
// 以小根堆为例
void insert(int x) {
heap[++len] = x; //先将元素放到数组末尾
up(len);
}
void up(int k) {
while (k > 1 && heap[k] < heap[k / 2]) {
swap(heap[k], heap[k / 2]);
k = k / 2;
}
}

删除操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 删除堆顶元素
void delete() {
swap(heap[1], heap[len]); // 先将堆顶元素与数组末尾元素交换
--len;
down(1);
}
void down(int k) {
while (k + k <= len) {
int j = k + k;
if (j + 1 <= len && heap[j + 1] < heap[j])
++j;
if (heap[k] <= heap[j])
break;
swap(heap[k], heap[j]);
k = j;
}
}
// 删除堆中任意元素
void delete(int pos) {
if (pos == len) {
--len;
return;
}
int x = heap[pos], y = heap[len];
swap(heap[pos], heap[len]);
--len;
up(pos);
down(pos);
}

http://xrcol.github.io/2024/02/28/5a423b3f9d02/
作者
XR
发布于
2024年2月28日
许可协议