************************* 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值