C++ 通过最小堆(完全二叉树)来实现,O(log n),(或者采用priority_queue
#include <array> #include <iostream> #include <type_traits> #include <vector> using namespace std; // 完全二叉树 - 最小堆 class PriorityQueue { private: vector<unsigned int> heap; // 未知数组大小 int size=0; void heapifUp(int idx) { // 插入:向上调整 while (idx) { int parent = (idx-1)/2; if (heap[idx]>=heap[parent]) break; swap(heap[idx], heap[parent]); idx = parent; } } void heapifDown(int idx) { // 删除:向下调整 while (true) { int left = 2*idx+1, right=left+1; int smallest = idx; if (left<size && heap[left] < heap[smallest]) smallest=left; if (right<size && heap[right] < heap[smallest]) smallest=right; if (smallest==idx) break; swap(heap[idx], heap[smallest]); idx = smallest; } } public: void enQueue(int x) { heap.push_back(x); heapifUp(size++); } void deQueue() { heap[0] = heap[--size]; // 最后一个元素移到堆顶 heap.pop_back(); heapifDown(0); } int peek() { return heap[0]; } int getSize() { return size; } }; int main() { int n, op; unsigned int x; cin >> n; PriorityQueue pq; while (n--) { cin >> op; switch (op) { case 1: cin >> x; pq.enQueue(x); break; case 2: if (pq.getSize()) cout << pq.peek() << endl; break; case 3: if (pq.getSize()) pq.deQueue();break; } } } // 64 位输出请用 printf("%lld")
采用priority_queue
#include <iostream> #include <queue> using namespace std; int main() { int n, op; unsigned int x; cin >> n; priority_queue<int, vector<int>, greater<>> pq; while (n--) { cin >> op; switch (op) { case 1: cin >> x; pq.push(x); break; case 2: cout << pq.top() << endl; break; case 3: pq.pop();break; } } } // 64 位输出请用 printf("%lld")