/*<br />此程式還有待改良,沒有用函數對象,只實現了最大堆(大根堆)有時間再修改吧<br />*/<br />#include<iostream><br />#include<string.h><br />using namespace std;<br />//優先隊列<br />template<class T><br />class pq{<br />public:<br />pq();//預設建構函式<br />pq(int n);//構造出空間為n的隊列<br />pq(T *t,int tsize);<br />~pq();//釋放所有的資源<br />int left(int i);//獲得左孩子<br />int right(int i);//獲得右孩子<br />int parent(int i);//獲得父節點<br />int size();//當前堆得大小<br />int length();//記憶體大小<br />void show();//顯示所有_size以內<br />void show_all();//顯示所有_length以內<br />void build();//建堆<br />void sort();//排序,從小到大<br />T top();//獲得堆頂元素<br />void pop();//彈出頂元素<br />void reverse();//翻轉<br />bool empty();//驗證是否為空白<br />bool increase_key(int,const T&);//增加指定位置的值,傳回值表示是否更新成功<br />void change_key(int,const T&);//改變一個元素為指定的值,同時保持大根堆<br />void insert(const T&);//增加一個元素<br />private:<br />void max_heapify(int n);<br />void swap(T&,T&);<br />private :<br />T * _a;<br />int _size;<br />int _length;<br />int _defaultsize;<br />};<br />template<class T><br />pq<T>::pq(){<br />_defaultsize=10;<br />_a=new T[_defaultsize];<br />_size=0;<br />_length=_defaultsize;<br />}<br />template<class T><br />pq<T>::pq(int n){<br />_a=new T[n];<br />_length=n;<br />_size=0;<br />}<br />template<class T><br />pq<T>::pq(T *t,int tsize){<br />_length=tsize;<br />_a=new T[_length];<br />for(_size=0;_size<tsize;_size++)<br />_a[_size]=t[_size];</p><p>}<br />template<class T><br />pq<T>::~pq(){<br />delete(_a);<br />}<br />template<class T><br />int pq<T>::left(int i){return (i+1)*2-1;}<br />template<class T><br />int pq<T>::right(int i){return (i+1)*2;}<br />template<class T><br />int pq<T>::parent(int i){return (i-1)/2;}<br />template<class T><br />int pq<T>::size(){return _size;}<br />template<class T><br />void pq<T>::swap(T& t1,T& t2){T tem=t1;t1=t2;t2=tem;}<br />template<class T><br />bool pq<T>::empty(){return _size==0;}<br />template<class T><br />int pq<T>::length(){return _length;}<br />template<class T><br />void pq<T>::show(){<br />for(int i=0;i<_size;i++)<br />cout<<_a[i]<<" ";<br />cout<<"(size:"<<_size<<")(length:"<<_length<<")"<<endl;</p><p>}<br />template<class T><br />void pq<T>::show_all(){<br />for(int i=0;i<_length;i++)<br />cout<<_a[i]<<" ";<br />cout<<"(size:"<<_size<<")(length:"<<_length<<")"<<endl;<br />}<br />template<class T><br />void pq<T>::max_heapify(int n)<br />{<br />int l,r,largest;<br />for(int i=n;i<_size;){<br />l=left(i),r=right(i);<br />if(l<_size&&r<_size){<br />if(_a[l]>_a[i])largest=l;<br />else largest=i;<br />if(_a[largest]<_a[r])largest=r;<br />if(largest!=i)<br />swap(_a[largest],_a[i]),i=largest;<br />else return;<br />}else{<br />if(l<_size&&_a[l]>_a[i])swap(_a[l],_a[i]);<br />if(r<_size&&_a[r]>_a[i])swap(_a[r],_a[i]);<br />return;<br />}<br />}<br />}<br />template<class T><br />void pq<T>::build()<br />{<br />if(_size<=1)return;<br />for(int i=parent(_size-1);i>=0;i--)<br />this->max_heapify(i);<br />}<br />template<class T><br />void pq<T>::reverse(){<br />for(int i=0;i<_size/2;i++)<br />swap(_a[i],_a[_size-1-i]);<br />}<br />template<class T><br />void pq<T>::sort(){<br />int tem=_size;<br />for(--_size;_size>0;--_size){<br />swap(_a[_size],_a[0]);<br />max_heapify(0);<br />}<br />_size=tem;<br />reverse();//翻轉<br />}<br />template<class T><br />T pq<T>::top(){return _a[0];}<br />template<class T><br />void pq<T>::pop(){<br />swap(_a[0],_a[--_size]);<br />max_heapify(0);<br />}<br />template<class T><br />bool pq<T>::increase_key(int i,const T &t){<br />if(i>=_size||_a[i]>t)return 0;<br />_a[i]=t;<br />while(_a[parent(i)]<_a[i]&&i!=0){<br />swap(_a[i],_a[parent(i)]);<br />i=parent(i);<br />}<br />return 1;<br />}<br />template<class T><br />void pq<T>::change_key(int i,const T& t){<br />if(increase_key(i,t))return;<br />else {<br />_a[i]=t;<br />max_heapify(i);<br />}<br />}<br />template<class T><br />void pq<T>::insert(const T& t){<br />if(_size==_length){<br />T *b=new T[_size*2];<br />memcpy(b,_a,_size*sizeof(T));<br />delete(_a);<br />_a=b;<br />_length=_size*2;<br />}<br />_a[_size++]=t;<br />increase_key(_size-1,t);<br />}<br />int main()<br />{<br />int a[9]={1,2,3,6,5,4,9,8,7};<br />pq<int> q(a,9);<br />q.show();</p><p>q.build();<br />q.show();<br />q.increase_key(5,11);</p><p>q.show();<br />q.change_key(0,0);<br />q.show();<br />while(q.size()<15)<br />q.insert(9);<br />q.show();<br />q.sort();<br />q.show();<br />while(!q.empty()){<br />cout<<"top:"<<q.top()<<" ";<br />q.pop();<br />cout<<"(size:"<<q.size()<<")(length:"<<q.length()<<")"<<endl;<br />}<br />return 0;<br />}