基本排序_基數排序_Java實現

轉載請註明出處:http://blog.csdn.net/ljmingcom304/article/details/50372591
本文出自:【梁敬明的博客】

1.基數排序

  基數排序又稱作桶排序,從序列的最低位開始,把當前位數對應的數字按0~9將元素進行歸類,遍歷到元素中不爲0的最高位爲止,直到最終完成排序。

基數排序

  存在一個序列【19】【82】【137】【22】【5】【431】【23】【20】【11】【109】,將其按照從小到大的順序進行排列。
  第一次分類,選取元素的個位數,按0~9將元素進行歸類。
  第二次分類,選取元素的十位數,按0~9將元素進行歸類。
  第三次分類,選取元素的百位數,按0~9將元素進行歸類。

2.示例代碼

  對一個長度爲N的序列從小到大進行排序,序列中元素的不爲0的最高位爲第i位,從第1位開始,將0~9存放到二維數組的第一維,再將序列中當前位的元素與第一維對應,存放到二維數組的第二維,按該存放方式到元素的最高位爲止。

public class RadixSort {

    public static void main(String[] args) {
        int[] array = { 19, 82, 137, 22, 5, 431, 23, 20, 11, 109 };
        RadixSort.sort(array);
        System.out.println("排序後數組:" + Arrays.toString(array));
    }

    public static void sort(int[] a) {
        int digit = 0;// 數組的最大位數
        for (int i : a) {
            // 獲取數組中數的最大位數
            digit = Math.max(digit, String.valueOf(i).length());
        }
        int k = 0;// 用戶記錄排序數組的索引
        int m = 1;// 當前的位數,個位用1表示,十位用2表示,以此類推
        int n = 1;// 用來表示當前位數的整數倍
        int type = 10;// 將餘數從0-9分爲10種類型
        int[][] temp = new int[type][a.length];// 第一維用來存儲餘數,第二維用來存儲餘數對應的數組值
        int[] order = new int[type];// 用戶第二維數組值得索引計數
        while (m <= digit) {
            // 遍歷數組中的每個元素,以當前位數依據餘數進行歸類
            for (int i = 0; i < a.length; i++) {
                int r = (a[i] / n) % 10;// 當前數值在當前位數的餘數
                temp[r][order[r]] = a[i];// 第一次爲temp[r][0],第二次爲temp[r][1]......
                order[r]++;
            }
            // 遍歷二維數組的第一維
            for (int i = 0; i < type; i++) {
                if (order[i] != 0) {// 當order[i]==0時,說明order[r]++沒有執行,temp[r][]中沒有存儲數組值
                    // 遍歷二維數組的第二維
                    for (int j = 0; j < order[i]; j++) {// order[i]表示當前i餘數的類型存儲的數組值的個數
                        a[k] = temp[i][j];
                        k++;
                    }
                }
                order[i] = 0;
            }
            k = 0;// 排序數組索引初始化
            m++;// 當前位數個數的索引
            n *= 10;// 當前位數向前推
        }
    }

}

3.算法分析

時間複雜度:
  待排序列有n個元素,所有元素的最大位數爲d(如最大位數爲百分位,則d=3),r爲當前位數的取值範圍(如0~9),基數排序的時間複雜度爲O(d(n+r))
算法穩定性:
  在基數排序中,當前位數相同的數值不會交換位置,所以基數排序是穩定的排序算法。

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