[堆] 手写一个最小堆练习
之前面试的问题被问到了这个,一脸懵逼。毕竟系统库还挺好用的……因此刚刚花了点时间忙写了一个作为练习(最小堆),没有做越界判断。
struct heap { vector<int> data; int cur = 0; heap(int n) { data.resize(n + 1); data[0] = INT_MIN; } void push(int x) { cur++; data[cur] = x; int i = cur; while (data[i / 2] > data[i]) { swap(data[i / 2], data[i]); i = i / 2; } } bool empty() { return cur == 0; } int top() { return data[1]; } int size() { return cur; } void pop() { data[1] = data[cur]; int i = 1; while (i * 2 + 1 < cur && data[i] > min(data[i * 2], data[i * 2 + 1])) { if (data[i * 2] < data[i * 2 + 1]) { swap(data[i], data[i * 2]); i = i * 2; } else { swap(data[i], data[i * 2 + 1]); i = i * 2 + 1; } } } void print() { int count = 1; for (int i = 1; i <= cur; i++) { cout << data[i] << " "; } cout << endl; } };