基數排序算法Java詳解

 前兩天去女子監獄某部門維護了下導師10年前的一個程序,發現偌大的一個系統,真正常用的1/10感覺都不到;其實就像我們所學一樣,像容器一樣裝在自己的腦海中,工作中用到的知識確實極少的;知識的深入帶來的必然是廣度發展,萬事萬物皆有聯繫,而且厚積才能薄發。

    排序算法寫了n種,可不像孔乙己一樣考驗"茴香豆"的"茴"字有幾種寫法,而是思維的一種拓展,等到使用的時候根據特定的場景變能靈活的選取更加合適的算法。今日所記錄的是基數排序。

一. 算法描述

基數排序(以整形爲例),將整形10進制按每位拆分,然後從低位到高位依次比較各個位。主要分爲兩個過程:
(1)分配,先從個位開始,根據位值(0-9)分別放到0~9號桶中(比如53,個位爲3,則放入3號桶中)
(2)收集,再將放置在0~9號桶中的數據按順序放到數組中
重複(1)(2)過程,從個位到最高位(比如32位無符號整形最大數4294967296,最高位10位)
以【521 310 72 373 15 546 385 856 187 147】序列爲例,具體細節如下圖所示:



在數據中最高位爲3,進行了三次分配、收集過程後,變成有序數組。

二. 算法分析

平均時間複雜度:O(dn)(d即表示整形的最高位數)

空間複雜度:O(10n) (10表示0~9,用於存儲臨時的序列) 

穩定性:穩定

三. 算法實現

    /******************************************************** 
    *函數名稱:GetNumInPos 
    *參數說明:num 一個整形數據 
    *          pos 表示要獲得的整形的第pos位數據 
    *說明:    找到num的從低到高的第pos位的數據 
    *********************************************************/  
    int GetNumInPos(int num,int pos)  
    {  
        int temp = 1;  
        for (int i = 0; i < pos - 1; i++)  
            temp *= 10;  
      
        return (num / temp) % 10;  
    }  
      
    /******************************************************** 
    *函數名稱:RadixSort 
    *參數說明:pDataArray 無序數組; 
    *          iDataNum爲無序數據個數 
    *說明:    基數排序 
    *********************************************************/  
    #define RADIX_10 10    //整形排序  
    #define KEYNUM_31 10     //關鍵字個數,這裏爲整形位數  
    void RadixSort(int* pDataArray, int iDataNum)  
    {  
        int *radixArrays[RADIX_10];    //分別爲0~9的序列空間  
        for (int i = 0; i < 10; i++)  
        {  
            radixArrays[i] = (int *)malloc(sizeof(int) * (iDataNum + 1));  
            radixArrays[i][0] = 0;    //index爲0處記錄這組數據的個數  
        }  
          
        for (int pos = 1; pos <= KEYNUM_31; pos++)    //從個位開始到31位  
        {  
            for (int i = 0; i < iDataNum; i++)    //分配過程  
            {  
                int num = GetNumInPos(pDataArray[i], pos);  
                int index = ++radixArrays[num][0];  
                radixArrays[num][index] = pDataArray[i];  
            }  
      
            for (int i = 0, j =0; i < RADIX_10; i++)    //收集  
            {  
                for (int k = 1; k <= radixArrays[i][0]; k++)  
                    pDataArray[j++] = radixArrays[i][k];  
                radixArrays[i][0] = 0;    //復位  
            }  
        }  
    }  


轉載自:http://blog.csdn.net/cjf_iceking/article/details/7943609

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章