C ++ large root heap achieves priority queue

Source: Internet
Author: User

/* <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/>}

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.