• <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>

            隨感而發

            雜七雜八

            統計

            留言簿(13)

            閱讀排行榜

            評論排行榜

            堆排序

            本來還想寫點思路的,詞窮,不知道怎么組織,算了。只有貼源代碼了。希望以后的我不要怪我哦!還可以看書嘛。書上講的已經很清楚了哦。呵呵。
            由于是學習,所以只寫了最大堆,也沒有怎么優化和詳細的測試。哎,無奈的貼上源代碼:
            #include <stdio.h>
            #include 
            <stdlib.h>

            //交換兩個整數。注意一定要if判斷是否兩個相等,如果
            //不相等才交換,如果相等也交換會出錯的。a^a = 0
            inline void Swap(int& a, int& b)
            {
                
            if (a != b)
                {
                    a
            ^= b;
                    b
            ^= a;
                    a
            ^= b;
                }
            }

            //維持一個最大堆
            int Heapify(int* npData, int nPos, int nLen)
            {
                
            int nMax = -1;                        //暫存最大值
                int nChild = nPos * 2;                //他的左孩子位置

                
            while(nChild <= nLen)                //判斷他是否有孩子
                {
                    nMax 
            = npData[nPos];            //是當前最大值為他

                    
            if (nMax < npData[nChild])        //與左孩子比較
                    {
                        nMax 
            = npData[nChild];        //如果比左孩子小,就時最大值為左孩子
                    }

                    
            //同理與右孩子比較,這里要注意,必須要保證有右孩子。
                    if (nChild + 1 <= nLen && nMax < npData[nChild + 1])    
                    {
                        
            ++nChild;                    //賦值最大值的時候把孩子變為右孩子,方便最后的數據交換
                        nMax = npData[nChild];

                    }

                    
            if (nMax != npData[nPos])        //判斷是否該節點比孩子都打,如果不大
                    {
                        Swap(npData[nPos], npData[nChild]);    
            //與最大孩子交換數據
                        nPos = nChild;                        //該節點位置變為交換孩子的位置
                        nChild *= 2;                        //因為只有交換后才使不滿足堆得性質。
                    }
                    
            else                            //都最大了,滿足堆得性質了。退出循環
                    {
                        
            break;
                    }
                }

                
            return 1;                        //維持結束。
            }

            //建立一個堆
            int BuildHeap(int* npData, int nLen)
            {
                
            //從nLen / 2最后一個有葉子的數據開始,逐一的插入堆,并維持堆得平衡。
                
            //因為堆是一個完全二叉樹,所以nlen/2+1- nLen之間肯定都是葉子。
                
            //葉子還判斷什么呢。只有一個數據,肯定滿足堆得性質咯。
                for (int i = nLen / 2; i >= 1--i)
                {
                    Heapify(npData, i, nLen);
                }

                
            return 1;
            }

            //堆排序
            int HeapSort(int* npData, int nLen)
            {
                BuildHeap(npData, nLen);        
            //建立一個堆。

                
            while(nLen >= 1)                //逐一交和第一個元素交換數據到最后
                {                                //完成排序
                    Swap(npData[nLen], npData[1]);
                    
            --nLen;
                    Heapify(npData, 
            1, nLen);//交換之后一定要維持一下堆得性質。
                }                            //不然小的成第一個元素,就不是堆了。

                
            return 1;
            }

            //main函數,
            int main()
            {
                
            int nData[11= {0,9,8,7,6,5,4,3,2,1,0};    //測試數據,下標從1開始哦。
                HeapSort(nData, 10);                        //堆排序

                
            for (int i = 1; i <= 10++i)                //輸出排序結果。
                {
                    printf(
            "%d ", nData[i]);
                }
                printf(
            "\n");
                 system(
            "pause");
                
            return 0;
            }

            呵呵,等知道怎么寫思路了補上。。

            posted on 2009-04-21 20:00 shongbee2 閱讀(4209) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構和算法

            亚洲国产成人精品久久久国产成人一区二区三区综 | 久久九九久精品国产免费直播| 久久本道综合久久伊人| 性做久久久久久久久老女人| 亚洲精品美女久久777777| 99久久精品午夜一区二区| 国产精品免费久久| 无码精品久久久天天影视| 91久久精品国产91性色也| 久久妇女高潮几次MBA| 日本久久久精品中文字幕| 久久久久久免费视频| 情人伊人久久综合亚洲| 国产精品久久婷婷六月丁香| 狠狠狠色丁香婷婷综合久久俺| 狠狠色丁香久久婷婷综合图片| 亚洲国产精品久久久久婷婷软件| 久久WWW免费人成一看片| 美女久久久久久| 久久99精品久久久久久9蜜桃| 久久精品国产亚洲av麻豆小说 | 99久久综合狠狠综合久久止| 国产精品中文久久久久久久| 精品久久久久久久中文字幕| 成人久久综合网| 97久久国产亚洲精品超碰热| 久久久久久久精品妇女99 | 久久精品国产久精国产一老狼| 国产精品久久久久久久午夜片| 99久久中文字幕| 久久久久久久亚洲Av无码| 日韩av无码久久精品免费| 精品久久亚洲中文无码| 久久天天躁狠狠躁夜夜不卡| 热久久最新网站获取| 久久91精品国产91久| 久久综合亚洲色HEZYO社区| 久久人人爽人人爽人人片AV高清| 色悠久久久久久久综合网| 伊人久久亚洲综合影院| 久久精品免费一区二区|