最大堆实现代码
template<class T>
class max_heap
{
int sz;
int num;
T* elements;
void shift_down(int);
void shift_up(int);
public:
max_heap(int s) :sz(s) { elements = new T[s]; num = 0; }
~max_heap() { delete[]elements; }
bool empty() { return num == 0; }
int size() { return num; }
int max_sz() { return sz; }
bool insert(T x);
bool pop();
T top() { T ret = elements[0]; return ret; }
T* __top__() { return &T[0]; }
};
template<class T>
void max_heap<T>::shift_down(int start)
{
int n = num;
int child = 2 * start + 1;
T temp = elements[start];
while (child < n) {
if (child + 1 < n && elements[child] < elements[child + 1])
child++;
if (temp >= elements[child])
break;
if (child % 2 == 0) {
elements[child / 2 - 1] = elements[child];
}
else {
elements[child / 2] = elements[child];
}
child = 2 * child + 1;
}
if (child % 2 == 0) {
elements[child / 2 - 1] = temp;
}
else {
elements[child / 2] = temp;
}
}
template<class T>
void max_heap<T>::shift_up(int start) {
int j = start, i = (j - 1) / 2;
T temp = elements[j];
while (j > 0) {
if (elements[i] >= temp)break;
else {
elements[j] = elements[i];
j = i;
i = (i - 1) / 2;
}
elements[j] = temp;
}
}
template<class T>
bool max_heap<T>::insert(T e) {
if (num + 1 >= sz) {
printf("堆已满,无法再添加新元素!");
return false;
}
elements[num] = e;
shift_up(num);
num++;
return true;
}
template<class T>
bool max_heap<T>::pop() {
if (!num) {
printf("堆空,无法删除元素!");
return false;
}
elements[0] = elements[num - 1];
num--;
shift_down(0);
return true;
}
最小堆实现
template<class T>
class min_heap
{
int sz;
int num;
T* elements;
void shift_down(int);
void shift_up(int);
public:
min_heap(int s) :sz(s) { elements = new T[s]; num = 0; }
~min_heap() { delete[]elements; }
bool empty() { return num == 0; }
int size() { return num; }
int max_sz() { return sz; }
bool insert(T x);
bool pop();
T top() { T ret = elements[0]; return ret; }
T* __top__() { return &T[0]; }
};
template<class T>
void min_heap<T>::shift_down(int start)
{
int n = num;
int child = 2 * start + 1;
T temp = elements[start];
while (child < n) {
if (child + 1 < n && elements[child] > elements[child + 1])
child++;
if (temp <= elements[child])
break;
if (child % 2 == 0) {
elements[child / 2 - 1] = elements[child];
}
else {
elements[child / 2] = elements[child];
}
child = 2 * child + 1;
}
if (child % 2 == 0) {
elements[child / 2 - 1] = temp;
}
else {
elements[child / 2] = temp;
}
}
template<class T>
void min_heap<T>::shift_up(int start) {
int j = start, i = (j - 1) / 2;
T temp = elements[j];
while (j > 0) {
if (elements[i] <= temp)break;
else {
elements[j] = elements[i];
j = i;
i = (i - 1) / 2;
}
elements[j] = temp;
}
}
template<class T>
bool min_heap<T>::insert(T e) {
if (num + 1 >= sz) {
printf("堆已满,无法再添加新元素!");
return false;
}
elements[num] = e;
shift_up(num);
num++;
return true;
}
template<class T>
bool min_heap<T>::pop() {
if (!num) {
printf("堆空,无法删除元素!");
return false;
}
elements[0] = elements[num - 1];
num--;
shift_down(0);
return true;
}