堆的实现

堆的实现方法,其中最核心的两个操作是上浮和下沉:

  • 上浮:如果一个节点比父节点大,那么需要交换这个两个节点;交换后还可能比它新的父节点大,因此需要不断地进行比较和交换操作。
  • 下沉:类似地,如果一个节点比父节小,也需要不断地向下进行比较和交换操作。如果一个节点有两个子节点,总是交换最大的子节点。
@ C++

vector<int> heap;
// 获得最大值
void top() {
return heap[0];
}
// 插入任意值: 把新的数字放在最后一位, 然后上浮
void push(int k) {
heap.push_back(k);
swim(heap.size() - 1);
}
// 删除最大值: 把最后一个数字挪到开头, 然后下沉
void pop() {
heap[0] = heap.back();
heap.pop_back();
sink(0);
}
// 上浮
void swim(int pos) {
while (pos > 1 && heap[pos/2] < heap[pos])) {
swap(heap[pos/2], heap[pos]);
pos /= 2;
}
}
// 下沉
void sink(int pos) {
while (2 * pos <= N) {
int i = 2 * pos;
if (i < N && heap[i] < heap[i+1]) ++i;
if (heap[pos] >= heap[i]) break;
swap(heap[pos], heap[i]);
pos = i;
}
}

通过将算法中的大于号和小于号互换,也可以得到一个快速获得最小值的优先队列。

posted @ 2022-05-28 15:34  Vonos  阅读(98)  评论(0)    收藏  举报