• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            oyjpArt ACM/ICPC算法程序設(shè)計(jì)空間

            // I am new in programming, welcome to my blog
            I am oyjpart(alpc12, 四城)
            posts - 224, comments - 694, trackbacks - 0, articles - 6

            HEAP

            Posted on 2006-09-08 23:25 oyjpart 閱讀(776) 評(píng)論(3)  編輯 收藏 引用

            ?

            // 說(shuō)實(shí)話(huà)?我還是挺喜歡HEAP這個(gè)數(shù)據(jù)結(jié)構(gòu)的?寫(xiě)個(gè)類(lèi)的HEAP吧?呵呵
            // by?Optimistic
            // 本程序是大根堆的操作集合?以及堆排序?優(yōu)先級(jí)隊(duì)列的堆實(shí)現(xiàn)
            #include? < string .h >
            #include?
            < iostream >
            using ? namespace ?std;

            template?
            < typename?T >
            class ?MaxHeap???????????????? // 大根堆?(本程序使用下標(biāo)與結(jié)點(diǎn)名相同的格式)
            {
            public :
            ?MaxHeap(
            int ?MaxHeapSize? = ? 10 );
            ?
            ~ MaxHeap() {delete?[]?heap;}
            ?
            int ?Size() { return ?heapSize;}
            ?MaxHeap
            < T >& ?Insert( const ?T & ?x);
            ?MaxHeap
            < T >& ?Delete(T & ?x);
            ?
            void ?MakeHeap(T? * ?a,? int ?size,? int ?ArraySize);
            ?T?Max()
            ?
            {
            ??
            if (heapsize? > ? 0 )????? // 判溢出
            ?? return ?heap[ 1 ];
            ?}

            private :
            ?T
            * ?heap;
            ?
            int ?heapSize;
            ?
            int ?MaxSize;?
            }
            ;

            template?
            < typename?T >
            MaxHeap
            < T > ::MaxHeap( int ?MaxHeapSize)?????????
            {
            ?MaxSize?
            = ?MaxHeapSize;
            ?heap?
            = ? new ?T[MaxSize + 1 ];
            ?heapSize?
            = ? 0 ;
            }


            template?
            < typename?T >
            MaxHeap
            < T >& ?MaxHeap < T > ::Insert( const ?T & ?x)? // 堆的插入?由葉結(jié)點(diǎn)向上找位置?在sort中是不需要插入的
            {
            ?
            if (heapSize? < ?MaxSize)????
            ?
            {
            ??heapSize
            ++ ;
            ??
            int ?i? = ?heapSize,?ic? = ?i / 2 ;
            ??
            while (ic? >= ? 1 )
            ??
            {
            ???
            if (x? <= ?heap[ic])? break ;
            ???heap[i]?
            = ?heap[ic];
            ???i?
            = ?ic;
            ???ic?
            = ?i? / ? 2 ;
            ??}

            ??heap[i]?
            = ?x;
            ?}

            ?
            return ? * this ;
            }


            template?
            < typename?T >
            MaxHeap
            < T >& ?MaxHeap < T > ::Delete(T & ?x)??????? // 堆的刪除?即根結(jié)點(diǎn)的刪除?從上到下
            {
            ?
            // 在操作上相當(dāng)與對(duì)最后一個(gè)結(jié)點(diǎn)從上到下的插入
            ? if (heapSize? > ? 0 )
            ?
            {
            ??x?
            = ?heap[ 1 ];
            ??T?y?
            = ?heap[heapSize -- ];
            ??
            int ?i? = ? 1 ,?ic? = ? 2 ;?????????????? // i記錄當(dāng)前查詢(xún)結(jié)點(diǎn)?ic記錄其子結(jié)點(diǎn)
            ?? while (ic? <= ?heapSize)???????????????
            ??
            {
            ???
            if (ic + 1 ? <= ?heapSize? && ?heap[ic]? < ?heap[ic + 1 ])?ic ++ ;
            ???
            if (y? >= ?heap[ic])? break ;
            ???heap[i]?
            = ?heap[ic];
            ???i?
            = ?ic;
            ???ic?
            = ? 2 * i;
            ??}

            ??heap[i]?
            = ?y;
            ?}

            ?
            return ? * this ;
            }


            template?
            < typename?T >
            void ?MaxHeap < T > ::MakeHeap(T? * ?a,? int ?size,? int ?ArraySize)? // 建堆:把數(shù)組堆化并處理成大根堆
            {
            ?
            // 堆化
            ?delete?[]?heap;
            ?heap?
            = ? new ?T[size + 1 ];
            ?memcpy(heap,?a,?(size
            + 1 ) * sizeof (T));?????? // 此處不要忘記乘sizeof(T)
            ?heapSize? = ?size;
            ?MaxSize?
            = ?ArraySize;
            ?
            // 處理堆
            ? int ?i? = ?heapSize / 2 ;
            ?
            for (;?i? >= ? 1 ;?i -- )???????????????????? // 從小到上依次調(diào)整
            ? {
            ??T?y?
            = ?heap[i];
            ??
            int ?ic? = ? 2 * i;
            ??
            while (ic? <= ?heapSize)?
            ??
            {
            ???
            if (ic + 1 ? <= ?heapSize? && ?heap[ic + 1 ]? > ?heap[ic])?ic ++ ;
            ???
            if (y? >= ?heap[ic])? break ;
            ???heap[ic
            / 2 ]? = ?heap[ic];
            ???ic?
            = ? 2 * ic;
            ??}

            ??heap[ic
            / 2 ]? = ?y;
            ?}

            }


            template?
            < typename?T >
            void ?HeapSort(T? * ?a,? int ?n)
            {
            ?MaxHeap
            < T > ?H( 0 );
            ?H.MakeHeap(a,?n,?n);
            ?T?x;
            ?
            for ( int ?i? = ?n;?i? >= ? 1 ;?i -- )
            ?
            {
            ??H.Delete(x);
            ??a[i]?
            = ?x;
            ?}

            }


            int ?main()
            {
            // ?freopen("heap.in",?"r",?stdin);
            ? int ?size,?i,? * ?a;
            ?printf(
            " Please?input?the?size?of?array:\n " );
            ?scanf(
            " %d " ,? & size);
            ?a?
            = ? new ? int [size + 1 ];
            ?printf(
            " Please?input?the?array?to?be?sorted:\n " );
            ?
            for (i = 1 ;?i <= size;?i ++ )
            ??scanf(
            " %d " ,? & a[i]);
            ?HeapSort(a,?size);
            ?
            for (i = 1 ;?i <= size;?i ++ )
            ??printf(
            " %4d " ,?a[i]);
            ?printf(
            " \n " );
            ?system(
            " Pause " );

            ?
            return ? 0 ;
            }


            Feedback

            # re: HEAP  回復(fù)  更多評(píng)論   

            2006-09-15 17:26 by
            heap, 好想學(xué), 不知道我為什么沒(méi)講heap的書(shū)...-_-

            # re: HEAP  回復(fù)  更多評(píng)論   

            2006-09-15 23:53 by Optimistic
            第一次遇到HEAP的時(shí)候好喜歡啊 呵呵 真是一個(gè)好東東!

            # re: HEAP  回復(fù)  更多評(píng)論   

            2006-10-25 22:40 by Asp
            不知道以后數(shù)據(jù)結(jié)構(gòu)會(huì)不會(huì)講……

            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            亚洲va国产va天堂va久久| 久久精品无码av| 波多野结衣中文字幕久久| 久久亚洲国产中v天仙www | 色偷偷久久一区二区三区| 伊人久久大香线蕉av一区| 狠狠久久亚洲欧美专区| 久久久精品人妻无码专区不卡 | 国产精品99久久99久久久| 久久中文精品无码中文字幕| 久久国产亚洲精品| 国产精品免费久久久久电影网| 伊人久久大香线焦AV综合影院| 国产精品久久久久乳精品爆 | 久久99中文字幕久久| 伊人热热久久原色播放www| 久久精品草草草| 99久久精品国内| 婷婷五月深深久久精品| 久久受www免费人成_看片中文| 久久91综合国产91久久精品| 日韩欧美亚洲综合久久| 香蕉久久影院| 国产综合成人久久大片91| 久久不射电影网| 久久久91精品国产一区二区三区 | 亚洲伊人久久综合影院| 久久久久99精品成人片| segui久久国产精品| 99久久精品免费看国产一区二区三区 | www亚洲欲色成人久久精品| 97精品伊人久久大香线蕉app| 午夜精品久久久久久中宇| 久久丫忘忧草产品| 亚洲狠狠婷婷综合久久久久| 色诱久久久久综合网ywww| 无码人妻久久久一区二区三区| 亚洲精品乱码久久久久久| 亚洲午夜久久久久久久久电影网| 一本一道久久综合狠狠老| 波多野结衣中文字幕久久|