1. 程式人生 > 實用技巧 >基數排序或者說是桶排序

基數排序或者說是桶排序

基數排序的基本思路

521 123 496 333 224

假設有這幾個數

排序的基本過程是

先獲取這五個數各位上的數,根據數對號入桶(所以需要十個桶子,0~9的下標分別對應這是存放數字幾的桶子)

第一次:

521入一號桶 123入三號桶 496入6號桶 333入三號桶 224入4號桶

再分別將0~9號桶中的資料取出 521  333  123  496  224

第二次:十位入桶

521 123 224 333 496 ———》 224  123  521  333  496

第三次:百位入桶

123 224 333 496 521 ———》 123  224  333  496  521

    public static void radixSort(int [] array){
        //根據每一遍的結果可以知道,要先獲得最大數的長度
        int max = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[max] < array[i]){
                max = i;
            }
        }
        int maxLength = (array[max] + "").length();
        
//用一個二維陣列來當桶子存放資料,行從上到下存放資料,列就表示各個位的數對對應桶子 //各個位的數字的範圍是0~10 ,每個桶子最多存放array.length個數據 int [] [] temp = new int[10][array.length]; //先從第一輪排序的情況分析 //count用來記錄每個桶子中存放的資料的個數,count[0]對應的數字就是桶子0中的元素個數... int [] count = new int [10]; //遍歷陣列,根據個位資訊對號入桶 int n = 0;
int k = 1; while (n < maxLength){ for (int value : array) { int number = value / k % 10; temp[number][count[number]] = value; count[number]++; } //全部對號入桶之後再將入桶的資料全部取出 int index = 0; for (int i = 0; i < 10; i++) { if (count[i] != 0){ for (int j = 0; j < count[i]; j++) { array[index++] = temp[i][j]; } count[i] = 0; } } k *= 10; n ++; } }