************************* heap.h *************************
template <typename T>
class Heap
{
public:
Heap( const int size );
~Heap(); //最好声明为虚函数
bool isLeaf( int pos );
void insert( const T& node );
T removeTop();
void removePos( const int pos );
private:
T *data;
int maxSize;
int cursize;
void buildHeap();
void moveUp( int pos );
void moveDown( int pos );
};
************************* heap.cpp *************************
#include <iostream>
template <typename T>
Heap::Heap( const int size )
{
maxsize = size;
cursize = 0;
data = new T[maxsize];
buildHeap();
}
template <typename T>
Heap::~Heap()
{
delete [] data;
}
template <typename T>
void Heap::buildHeap()
{
for(int pos=(cursize/2)-1; pos>=0; pos--)
{
moveDown(pos);
}
}
template <typename T>
bool Heap::isLeaf( int pos )
{
return ( pos >= cursize/2 && pos < cursize ); //cursize/2是第一个叶子节点
}
template <typename T>
void Heap::insert( const T& node )
{
if( cursize < maxsize )
{
int pos = cursize;
data[cursize++] = node;
moveUp(pos);
}
else
{
printf("Heap is Full");
}
}
template <typename T>
T Heap::removeTop()
{
T tmp;
if( cursize != 0 )
{
tmp = data[0];
data[0] = data[--cursize]; //将最后一个元素放在[0],cursize-1
moveDown(0);
}
else
{
throw("Heap is Empty");
}
return tmp;
}
template <typename T>
void Heap::removePos( const int pos )
{
if( pos<0 || pos >= cursize )
{
printf("Illegal Pos");
}
else
{
data[pos] = data[--cursize];
moveUp(pos);
moveDown(pos);
}
}
template <typename T>
void Heap::moveUp( const int pos )
{
T tmp = data[pos];
int next_pos = ( pos - 1 ) / 2; //next_pos指向父亲节点的位置
while( next_pos >= 0 )
{
if( data[next_pos] < data[pos] ) //大顶堆
data[pos] = data[next_pos]; //父节点值下移
pos = next_pos;
next_pos = ( next_pos - 1 ) / 2;
}
data[pos] = tmp;
}
template <typename T>
void Heap::moveDown( const int pos )
{
T tmp = data[pos];
int next_pos = pos * 2 + 1; //next_pos先指向左子节点
while( next_pos < cursize )
{
if( next_pos + 1 < cursize && data[next_pos+1] > data[next_pos] ) //找到值较大的子节点
next_pos++;
if( data[next_pos] > tmp )
data[pos] = data[next_pos];
else
break;
pos = next_pos;
next_pos = next_pos * 2 + 1;
}
data[pos] = tmp;
}
堆
最新推荐文章于 2024-09-15 17:39:17 发布