基數(shù)排序

算法思想:
基數(shù)排序(radix sort)屬于“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,
它是透過鍵值的各個(gè)位的值,將要排序的元素分配至某些“桶”中,藉以達(dá)到排序的作用, 屬于穩(wěn)定性排序

理解:
初始10個(gè)桶對應(yīng)標(biāo)號 0-9,
第一次將每個(gè)元素按照個(gè)位放入對應(yīng)下標(biāo)的桶中;
將按照個(gè)位拍好序列的元素依次放入arr中(此時(shí)個(gè)位排好序了,而且如果只有1位,從0-9的這些數(shù)已經(jīng)是有序序列了)
在新的arr中,第二次將每個(gè)元素的十位放入對應(yīng)下標(biāo)的桶中; (在個(gè)位已經(jīng)拍好序的基礎(chǔ)上,對十位也排好序)
(只有兩位的話:如果十位不同,則放入不同的桶,直接能排好序了;如果十位相同,而個(gè)位是已經(jīng)排好序的,也能對任何的兩位數(shù)排好序)
依次類推。。。

public class RadixSorting {
    public static void radixSort(int[] arr){
        // 找出arr中最大的元素
        int maxElement = getMaxElement(arr);
        // 獲取maxElement的length
        int lenthForMaxElement = getMaxElementLen(maxElement);
        //二維數(shù)組表示10個(gè)桶,每個(gè)桶用一維數(shù)組表示
        int[][] buckets = new int[10][arr.length];
        //用來記錄每個(gè)桶所放元素的個(gè)數(shù). 比如:bucketElementsCounts[0],記錄的就是buckets[0]桶的放入數(shù)據(jù)的個(gè)數(shù)
        int[] bucketElementsCount = new int[10];
        for (int i = 0,n = 1; i < lenthForMaxElement; i++,n*=10) {
            //比如:num = 10,按照個(gè)位放入對應(yīng)下標(biāo)的桶中;num = 100,按照十位放入對應(yīng)下標(biāo)的桶中
            for (int j = 0; j < arr.length; j++) {
                //取出個(gè)位/十位/百位....
               int remainder =  arr[j]/n % 10;
               //arr[j]放入桶中
                buckets[remainder][bucketElementsCount[remainder]] = arr[j];
                //元素個(gè)數(shù)+1
                bucketElementsCount[remainder]++;
            }
            //一輪放完后,按照桶的順序(一維數(shù)組的下標(biāo)依次取出數(shù)據(jù)放入原數(shù)組)
            int index = 0;
            //遍歷每一個(gè)桶,并將桶中的數(shù)據(jù)放入原數(shù)組
            for (int k = 0; k < bucketElementsCount.length; k++) {
                //桶中有數(shù)據(jù)才放入數(shù)組
                if (bucketElementsCount[k] != 0) {
                    for (int l = 0; l < bucketElementsCount[k]; l++) {
                        arr[index] = buckets[k][l];
                        index++;
                    }
                }
                //每一輪處理后都需要將 bucketElementsCount[k] = 0,用于下一輪桶中數(shù)據(jù)被覆蓋?。?!
                bucketElementsCount[k] = 0;
            }
        }

    }

    public static void main(String[] args) {
        int[] arr = {101,34,39,1,305,1,90,123};
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    private static int getMaxElement(int[] arr) {
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }

    private static int getMaxElementLen(int maxElement) {
        int temp = maxElement;
        int counter=0;
        while (temp >0) {
            temp /=10;
            counter++;
        }
        return counter;
    }

}
用于輔助理解 - 第一輪排序
用于輔助理解 - 第二輪排序
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容