To boldly go where no one has gone before.

【学习笔记】手写堆

2019-10-04 22:19:25


手写堆

主要是记录写法。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10;
int heap[MAXN], size = 0;

void push(int x) {
    heap[++size] = x;
    int tmp = size;
    while (tmp > 1) {
        int next = tmp >> 1;
        if (heap[tmp] >= heap[next])
            return ;
        swap(heap[next], heap[tmp]);
        tmp = next;
    }
    return ;
}

void pop() {
    heap[1] = heap[size--];
    int tmp = 1;
    while (tmp << 1 <= size) {
        int next = tmp << 1;
        if (next < size && heap[next] > heap[next + 1])
            next++;
        if (heap[tmp] <= heap[next])
            return ;
        swap(heap[tmp], heap[next]);
        tmp = next;
    }
    // pop() 操作比较陌生,可以着重记一下
}

int top() {
    return heap[1];
}

int main() {
    int n;
    scanf("%d", &n);
    for (int opt, x; n; n--) {
        scanf("%d", &opt);
        switch (opt) {
            case 1 : {
                scanf("%d", &x);
                push(x);
                break;
            }
            case 2 : {
                printf("%d\n", top());
                break;
            }
            case 3 : {
                pop();
                break;
            }
        }
    }
    return 0;
}