优先队列
优先队列可在O(1)时间内货的最大值,并且可以在O(logn)时间内取出最大值或插入任意值。
用数组表示时,位置 i 的结点的父结点位置一定是 i/2 ,它的两个子结点一定是 2i 和 2i+1。
class Heap {
private:
vector<int> heap;
// 上浮
void swim(int pos) {
while (pos > 1 && heap[pos / 2] < heap[pos]) {
swap(heap[pos / 2], heap[pos]);
pop /= 2;
}
}
// 下沉
void sink(int pos) {
while (2 * pos <= heap.size()) {
int i = 2 * pos;
// 选择子结点更大的那个
if (i < heap.size() && heap[i] < heap[i + 1]) {
++i;
}
// 父结点与子结点比较
if (heap[pos] >= heap[i]) {
break;
}
swap(heap[pos], heap[i]);
pos = i;
}
}
public:
}
// 获得最大值
void top() {
return heap[0];
}
// 插入任意值,把新的数字放在最后一位,然后上浮
void push(int k) {
heap.push_back(k); // 在heap最后一个向量后面插入一个元素
swim(heap.size() - 1);
}
// 删除最大值,把最后一个数字挪到开头,然后下沉
void pop() {
heap[0] = heap.back(); // back()返回heap的最后一个元素
heap.pop_back(); // 删除heap的最后一个元素
sink(0);
}