来源:互联网 发布:java sftp 编辑:程序博客网 时间:2024/05/16 04:55
************************* 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-1moveDown(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];elsebreak;pos = next_pos;next_pos = next_pos * 2 + 1; }data[pos] = tmp;}

0 0