C++ 大根堆 实现优先队列

/* 此程序还有待改良,没有用函数对象,只实现了最大堆(大根堆)有时间再修改吧 */ #include #include using namespace std; //优先队列 template class pq{ public: pq();//默认构造函数 pq(int n);//构造出空间为n的队列 pq(T *t,int tsize); ~pq();//释放所有的资源 int left(int i);//获得左孩子 int right(int i);//获得右孩子 int parent(int i);//获得父节点 int size();//当前堆得大小 int length();//内存大小 void show();//显示所有_size以内 void show_all();//显示所有_length以内 void build();//建堆 void sort();//排序,从小到大 T top();//获得堆顶元素 void pop();//弹出顶元素 void reverse();//翻转 bool empty();//验证是否为空 bool increase_key(int,const T&);//增加指定位置的值,返回值表示是否更新成功 void change_key(int,const T&);//改变一个元素为指定的值,同时保持大根堆 void insert(const T&);//增加一个元素 private: void max_heapify(int n); void swap(T&,T&); private : T * _a; int _size; int _length; int _defaultsize; }; template pq::pq(){ _defaultsize=10; _a=new T[_defaultsize]; _size=0; _length=_defaultsize; } template pq::pq(int n){ _a=new T[n]; _length=n; _size=0; } template pq::pq(T *t,int tsize){ _length=tsize; _a=new T[_length]; for(_size=0;_size pq::~pq(){ delete(_a); } template int pq::left(int i){return (i+1)*2-1;} template int pq::right(int i){return (i+1)*2;} template int pq::parent(int i){return (i-1)/2;} template int pq::size(){return _size;} template void pq::swap(T& t1,T& t2){T tem=t1;t1=t2;t2=tem;} template bool pq::empty(){return _size==0;} template int pq::length(){return _length;} template void pq::show(){ for(int i=0;i<_size;i++) cout<<_a[i]<<" "; cout<<"(size:"<<_size<<")(length:"<<_length<<")"< void pq::show_all(){ for(int i=0;i<_length;i++) cout<<_a[i]<<" "; cout<<"(size:"<<_size<<")(length:"<<_length<<")"< void pq::max_heapify(int n) { int l,r,largest; for(int i=n;i<_size;){ l=left(i),r=right(i); if(l<_size&&r<_size){ if(_a[l]>_a[i])largest=l; else largest=i; if(_a[largest]<_a[r])largest=r; if(largest!=i) swap(_a[largest],_a[i]),i=largest; else return; }else{ if(l<_size&&_a[l]>_a[i])swap(_a[l],_a[i]); if(r<_size&&_a[r]>_a[i])swap(_a[r],_a[i]); return; } } } template void pq::build() { if(_size<=1)return; for(int i=parent(_size-1);i>=0;i--) this->max_heapify(i); } template void pq::reverse(){ for(int i=0;i<_size/2;i++) swap(_a[i],_a[_size-1-i]); } template void pq::sort(){ int tem=_size; for(--_size;_size>0;--_size){ swap(_a[_size],_a[0]); max_heapify(0); } _size=tem; reverse();//翻转 } template T pq::top(){return _a[0];} template void pq::pop(){ swap(_a[0],_a[--_size]); max_heapify(0); } template bool pq::increase_key(int i,const T &t){ if(i>=_size||_a[i]>t)return 0; _a[i]=t; while(_a[parent(i)]<_a[i]&&i!=0){ swap(_a[i],_a[parent(i)]); i=parent(i); } return 1; } template void pq::change_key(int i,const T& t){ if(increase_key(i,t))return; else { _a[i]=t; max_heapify(i); } } template void pq::insert(const T& t){ if(_size==_length){ T *b=new T[_size*2]; memcpy(b,_a,_size*sizeof(T)); delete(_a); _a=b; _length=_size*2; } _a[_size++]=t; increase_key(_size-1,t); } int main() { int a[9]={1,2,3,6,5,4,9,8,7}; pq q(a,9); q.show(); q.build(); q.show(); q.increase_key(5,11); q.show(); q.change_key(0,0); q.show(); while(q.size()<15) q.insert(9); q.show(); q.sort(); q.show(); while(!q.empty()){ cout<<"top:"<

你可能感兴趣的:(算法导论)