写在前面
闲来无事写了个C++版本的最小堆,堆的底层采用数组,基本的上浮和下沉过程请参考算法导论,非常简单。这里不再画图解释,具体的实现代码如下。
代码实现
template<typename T>
class PriorityQueue {
private:
vector<T> heap;
public:
PriorityQueue() {
}
void push(T value) {
heap.push_back(value);
if(heap.size() == 1) return;
int size = heap.size();
auto pos = size-1;
using std::swap;
while(pos>0&&heap[(pos-1)/2]>heap[pos]) {
swap(heap[(pos-1)/2],heap[pos]);
pos = (pos-1)/2;
}
}
T pop() {
if(heap.size() == 0) return -1;
auto top = heap[0];
using std::swap;
swap(heap[0],heap.back());
heap.pop_back();
int size = heap.size();
int pos = 0;
while(pos<size) {
int left = pos*2+1;
if(left>=size) break;
if(left+1<size&&heap[left]>heap[left+1]) left++;
if(heap[left]>heap[pos]) break;
swap(heap[left],heap[pos]);
pos = left;
}
return top;
}
vector<T>& getHeapVector(){return heap;};
T top() {
return heap[0];
}
int size() {return heap.size();};
};
该版本是非常简化的版本,只做参考。