• <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 閱讀(4211) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構和算法

            久久综合亚洲色HEZYO国产| 精品蜜臀久久久久99网站| 精品欧美一区二区三区久久久| 国产福利电影一区二区三区,免费久久久久久久精 | 伊人久久国产免费观看视频| 成人午夜精品无码区久久| 久久久久人妻精品一区二区三区 | 亚洲人成无码网站久久99热国产 | 99久久国产热无码精品免费| 亚洲欧美日韩精品久久| 亚洲国产精品久久久天堂| 久久综合中文字幕| 久久久久免费精品国产| 嫩草影院久久99| 无码久久精品国产亚洲Av影片 | 怡红院日本一道日本久久| 精品国产乱码久久久久久人妻| 久久婷婷久久一区二区三区| 日本五月天婷久久网站| 久久e热在这里只有国产中文精品99| 一本久久a久久精品亚洲| 久久无码一区二区三区少妇| 97久久超碰国产精品旧版| 色欲综合久久躁天天躁蜜桃| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲伊人久久成综合人影院| 国产精品天天影视久久综合网| 久久精品无码一区二区WWW| 青青久久精品国产免费看| 狠狠色丁香久久婷婷综| 99久久精品这里只有精品| 精品国产乱码久久久久久1区2区 | 国产精品久久新婚兰兰| 久久久久综合中文字幕| 国产免费福利体检区久久| 国产激情久久久久影院老熟女| 精品999久久久久久中文字幕| 99久久精品影院老鸭窝| 久久久精品午夜免费不卡| 精品久久久久久久久久久久久久久 | 人妻无码久久精品|