/* <Br/> the <SPAN class = 'wp _ keywordlink '> Program </span> is still to be improved. It only implements the maximum heap (large root heap) without function objects) modify it if you have time. <br/> */<br/> # include <iostream> <br/> # include <string. h> <br/> using namespace STD; <br/> // priority queue <br/> template <class T> <br/> class PQ {<br/> public: <br/> PQ (); // default constructor <br/> PQ (int n ); // construct a queue with n space <br/> PQ (T * t, int tsize); <br/> ~ PQ (); // release all resources <br/> int left (int I); // obtain the left child <br/> int right (int I ); // obtain the right child <br/> int parent (int I); // obtain the parent node <br/> int size (); // current heap size <br/> int length (); // memory size <br/> void show (); // show all <br/> void show_all (); // show all <br/> void build (); // heap creation <br/> void sort (); // sort, from small to large <br/> T top (); // obtain the heap top element <br/> void POP (); // The top element <br/> void reverse (); // flip <br/> bool empty (); // verify whether it is empty <br/> bool increase_key (INT, con St t &); // Add the value at the specified position. The returned value indicates whether the update is successful. <br/> void change_key (INT, const T &); // change an element to a specified value while maintaining a large root heap <br/> void insert (const T &); // Add an element <br/> PRIVATE: <br/> void max_heapify (int n); <br/> void swap (T &, T &); <br/> PRIVATE: <br/> T * _; <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/> _ lengt H = _ 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/> 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>: Re Verse () {<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 (); // flip <br/>}< br/> template <class T> <br/> t pq <t >:: top () {return _ A [0];} <br/> template <class T> <br/> void PQ <t>: Pop () {<br/> swap (_ [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/> 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/> d Elete (_ 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/>}