数组实现的版本在前面
这个是 链表实现
#include<vector>
using namespace std;
#ifndef HEAP_H
#define HEAP_H
template<class T>
class Heap{
public:
void fix_up()
{
int pos = vec.size() - 1;
T n_val = vec[pos];
int parent = (pos - 1) / 2;
while (parent >= 0 && n_val < vec[parent]){ //
swap(vec[parent], vec[pos]);
pos = parent;
parent = (pos - 1) / 2;
n_val = vec[pos];
}
}
void push( T val)
{
vec.push_back(val); // 1.
fix_up(); // 2.
}
void fix_down(){
if (vec.empty())
return;
int pos = 0;
T n_val = vec[pos];
int left = pos * 2 + 1;
int right = left + 1;
while (left < vec.size()){
T *ref;
int npos;
if (right < vec.size()) {
ref = &(vec[left] < vec[right] ? vec[left] : vec[right]) ; // 跟子节点中较小节点比较.
npos = vec[left] < vec[right] ? left : right; //下一步的位置
}
else {
ref = &vec[left];
npos = left;
}
if (n_val > *ref) {
swap(vec[pos], *ref);
}
else
break;
pos = npos;
left = pos * 2 + 1;
right = left + 1;
if(pos < vec.size())
n_val = vec[pos];
}
}
T pop()
{
T r = vec[0];
vec[0] = vec[vec.size() - 1]; // 1. 把尾部的值放到头部
vec.pop_back();
fix_down(); // 2. 向下调整
return r;
}
bool empty(){
return vec.size()==0;
}
private:
vector<T> vec;
};
#endif // HEAP_H