您的位置:首页 > 其它

堆——大根堆

2015-08-07 21:04 429 查看
#include <iostream>
#include <iomanip>
using namespace std;
template<typename DataType>
class Heap
{
public:
Heap();
Heap(int);
Heap( DataType[], int);
bool removeTop();
DataType getTop();
bool insert( DataType );
bool empty() const;
void display() const;
private:
int capacity;
int size;
DataType * topPointer;
void displayAux( int, int ) const;
};

template<typename DataType>
Heap<DataType>::Heap()
{
size = 0;
capacity = 10;
topPointer = new DataType[capacity + 1];
}

template<typename DataType>
Heap<DataType>::Heap(int capacity)
{
size = 0;
this.capacity = capacity;
topPointer = new DataType[capacity + 1];
}

template<typename DataType>
Heap<DataType>::Heap(DataType arr[], int num)
{
size = 0;
capacity = num;
topPointer = new DataType[capacity + 1];
for(int i = 0; i < num; i++)
insert( arr[i] );
}

template<typename DataType>
DataType Heap<DataType>::getTop()
{
return *(topPointer);
}

template<typename DataType>
bool Heap<DataType>::removeTop()
{
*(topPointer + 1) = *(topPointer + size);
int start = 1;
int end = size;
int next = 2*start;
while( next <= end )
{
if( next < end )
{
if( *(topPointer + next) < *(topPointer + next + 1) )
next = next + 1;
}

if( *(topPointer + start) < *(topPointer + next ) )
{
DataType tmp = *(topPointer + start);
*(topPointer + start) = *(topPointer + next);
*(topPointer + next) = tmp;
}

start = next;
next = 2*start;
}
size--;
return true;
}

template<typename DataType>
bool Heap<DataType>::insert(DataType item)
{
if( ++size <= capacity )
*(topPointer + size) = item;
else
return false;

int start = size;
int next = size/2;

while( next > 0 && *(topPointer + start) > *(topPointer + next) )
{
DataType tmp = *(topPointer + next);
*(topPointer + next) = *(topPointer + start);
*(topPointer + start) = tmp;

start = next;
next = start/2;
}
return true;
}

template<typename DataType>
bool Heap<DataType>::empty() const
{
return(0 == size);
}

template<typename DataType>
void Heap<DataType>::display() const
{
displayAux(1,0);
}

template<typename DataType>
void Heap<DataType>::displayAux(int index, int indent) const
{
if( index <= size )
{
displayAux( index * 2 , indent + 8 );
cout << setw(indent) << *( topPointer + index) << endl;
displayAux( index * 2 + 1, indent + 8 );
}
else
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: