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

            閱讀排行榜

            評論排行榜

            基數排序

            今天學了基數排序,據說他的時間復雜度也是O(n),他的思路就是:
            沒有計數排序那么理想,我們的數據都比較集中,都比較大,一般是4,5位。基本沒有小的數據。
            那我們的處理很簡單,你不是沒有小的數據嘛。我給一個基數,例如個位,個位都是[0-10)范圍內的。先對他進行歸類,把小的放上面,大的放下面,然后個位排好了,在來看10位,我們也這樣把小的放上面,大的放下面,依次內推,直到最高位排好。那么不就排好了嗎?我們只需要做d(基數個數)的循環就可以了。時間復雜度相當于O(d * n) 因為d為常量,例如5位數,d就是5.所以近似為O(n)的時間復雜度。這次自己寫個案例:

            最初的數據

            排好個位的數據

            排好十位的數據

            排好百位的數據

            981

            981

            725

            129

            387

            753

            129

            387

            753

            955

            753

            456

            129

            725

            955

            725

            955

            456

            456

            753

            725

            387

            981

            955

            456

            129

            387

            981

            這里只需循環3次就出結果了。

            <!--[if !supportLists]-->3.       <!--[endif]-->但是注意,我們必須要把個位排好。但是個位怎么排呢?這個是個問題。書上說的是一疊一疊的怎么合并,我是沒有理解的。希望知道的有高手教我一下。

            我是用的一個計數排序來排各位的,然后排十位。效率應該也低不到哪里去。呵呵。。

            思路就這樣咯。奉上源代碼:

             

            #include <stdio.h>
            #include 
            <stdlib.h>

            //計數排序,npRadix為對應的關鍵字序列,nMax是關鍵字的范圍。npData是具體要
            //排的數據,nLen是數據的范圍,這里必須注意npIndex和npData對應的下標要一致
            //也就是說npIndex[1] 所對應的值為npData[1]
            int RadixCountSort(int* npIndex, int nMax, int* npData, int nLen)
            {
                
            //這里就不用說了,計數的排序。不過這里為了是排序穩定
                
            //在標準的方法上做了小修改。

                
            int* pnCount  = (int*)malloc(sizeof(int)* nMax);        //保存計數的個數
                for (int i = 0; i < nMax; ++i)
                {
                    pnCount[i] 
            = 0;
                }
                
            for (int i = 0; i < nLen; ++i)    //初始化計數個數
                {
                    
            ++pnCount[npIndex[i]];
                }

                
            for (int i = 1; i < 10++i)  //確定不大于該位置的個數。
                {
                    pnCount[i] 
            += pnCount[i - 1];
                }

                
            int * pnSort  = (int*)malloc(sizeof(int* nLen);    //存放零時的排序結果。

                
            //注意:這里i是從nLen-1到0的順序排序的,是為了使排序穩定。
                for (int i = nLen - 1; i >= 0--i)
                {
                    
            --pnCount[npIndex[i]];        
                    pnSort[pnCount[npIndex[i]]] 
            = npData[i];
                }

                
            for (int i = 0; i < nLen; ++i)        //把排序結構輸入到返回的數據中。
                {
                    npData[i] 
            = pnSort[i];
                }
                free(pnSort);                        
            //記得釋放資源。
                free(pnCount);
                
            return 1;
            }

            //基數排序
            int RadixSort(int* nPData, int nLen)
            {
                
            //申請存放基數的空間
                int* nDataRadix    = (int*)malloc(sizeof(int* nLen);

                
            int nRadixBase = 1;    //初始化倍數基數為1
                bool nIsOk = false//設置完成排序為false

                
            //循環,知道排序完成
                while (!nIsOk)
                {
                    nIsOk 
            = true;
                    nRadixBase 
            *= 10;
                    
            for (int i = 0; i < nLen; ++i)
                    {
                        nDataRadix[i] 
            = nPData[i] % nRadixBase;
                        nDataRadix[i] 
            /= nRadixBase / 10;
                        
            if (nDataRadix[i] > 0)
                        {
                            nIsOk 
            = false;
                        }
                    }
                    
            if (nIsOk)        //如果所有的基數都為0,認為排序完成,就是已經判斷到最高位了。
                    {
                        
            break;
                    }
                    RadixCountSort(nDataRadix, 
            10, nPData, nLen);
                }

                free(nDataRadix);

                
            return 1;
            }

            int main()
            {
                
            //測試基數排序。
                int nData[10= {123,5264,9513,854,9639,1985,159,3654,8521,8888};
                RadixSort(nData, 
            10);
                
            for (int i = 0; i < 10++i)
                {
                    printf(
            "%d ", nData[i]);
                }
                printf(
            "\n");

                system(
            "pause");
                
            return 0;
            }

             


            posted on 2009-04-24 21:36 shongbee2 閱讀(13406) 評論(2)  編輯 收藏 引用 所屬分類: 數據結構和算法

            評論

            # re: 基數排序[未登錄] 2012-06-02 10:01 MICHAEL

            你的這個程序有一定的問題
            比如這組數據:
            int nData[10] = {1046,2084,9046,12074,56,7026,8099,17059,33,1};
              回復  更多評論   

            # re: 基數排序 2013-06-28 13:49 hum

            試了下,確實有點問題,修改一下就好了。
            修改前
            if (nDataRadix[i] > 0)
            {
            nIsOk = false;
            }
            修改后:
            if (nPData[i]/nRadixBase > 0)
            {
            nIsOk = false;
            }  回復  更多評論   

            97久久婷婷五月综合色d啪蜜芽| 久久久久人妻精品一区| 久久精品国产第一区二区三区| 久久影院亚洲一区| 欧美激情精品久久久久久| 26uuu久久五月天| 91精品国产91久久久久久| 国产精品久久久久…| 精品无码久久久久久尤物| 伊人久久大香线蕉亚洲五月天| 久久精品中文字幕一区| 久久久国产99久久国产一| 久久精品国产亚洲αv忘忧草| 久久人人爽人人爽人人av东京热| 要久久爱在线免费观看| 久久久亚洲裙底偷窥综合| 久久亚洲精品国产精品| 国产亚洲美女精品久久久久狼| 成人综合伊人五月婷久久| 国内精品久久久久久久久电影网 | 久久天天躁狠狠躁夜夜avapp| 色综合久久久久久久久五月| 久久久久人妻一区精品性色av| 精品精品国产自在久久高清| 777久久精品一区二区三区无码| 国产午夜精品理论片久久| 日韩久久久久中文字幕人妻 | 亚洲AV日韩精品久久久久| 中文字幕热久久久久久久| 久久免费视频观看| 久久久午夜精品福利内容| 伊人久久大香线蕉AV色婷婷色| 51久久夜色精品国产| 亚洲人成精品久久久久| 伊人丁香狠狠色综合久久| 亚洲第一极品精品无码久久| 99久久精品国产一区二区蜜芽| 久久中文字幕精品| 99久久综合国产精品二区| 久久久久亚洲av无码专区喷水 | 中文国产成人精品久久亚洲精品AⅤ无码精品 |