代码主要实现了小顶堆的创建、插入、删除、向上调整、向下调整、遍历、排序
#include <iostream>
#include <assert.h>
using namespace std;
template <typename T>
class MinHeap
{
public:
MinHeap(int sz = DefaultSize)
{
maxsize = sz > DefaultSize ? sz:DefaultSize;
heap = new T [maxsize];
cursize = 0;
}
~MinHeap()
{
delete[]heap;
heap = NULL;
maxsize = cursize = 0;
}
public:
void Insert(T &x)
{
if(cursize >= maxsize)
return;
heap[cursize] = x;
ShiftUp(cursize);
cursize++;
}
T RemoveHeap()
{
assert(cursize != 0);
T key = heap[0];
heap[0] = heap[cursize-1];
cursize--;
ShiftDown(0);
return key;
}
void ShowHeap()const
{
for (int i = 0; i < cursize; ++i) {
cout<<heap[i]<<" ";
}
cout<<endl;
}
void Sort()
{
while (cursize != 0){
cout<<RemoveHeap()<<" ";
}
}
protected:
void ShiftUp(int pos)
{
int i = (pos-1)/2;//最后分支 i 是 j parent
int j = pos;
int tmp = heap[j];
while(j > 0)
{
if(tmp < heap[i])
{
heap[j] = heap[i];
j = i;
i = (j-1)/2;
}
else
break;
}
heap[j] = tmp;
}
void ShiftDown(int pos)
{
int i = pos;
int j = 2*i+1;
int tmp = heap[i];
while(j < cursize)
{
if(j+1<cursize && heap[j]>heap[j+1])
j++;
if(heap[j] < tmp)
{
heap[i] = heap[j];
i = j;
j = 2*i+1;
}
else
break;
}
heap[i] = tmp;
}
private:
enum {DefaultSize = 10};
T *heap;
int cursize;
int maxsize;
};
int main ()
{
int arr[] = {49,38,65,97,13,27};
MinHeap<int >mh;
int n = sizeof(arr) / sizeof(int );
for (int i = 0; i < n; ++i) {
mh.Insert(arr[i]);
}
mh.ShowHeap();
mh.Sort();
return 0;
}