學習筆記-基數排序

基數排序原理:

判斷每個數的個位、十位、百位…
然後分別放到對應的桶中(這裏的桶一共有10個,分別是{0,1,2,3,4,5,6,7,8,9} 個位如果是1就放到1的桶中),每判斷完一位,將數據按順序(就是從小到大)取出,然後每一位都是這樣,上圖:

數據爲arr={53, 3, 542, 748, 14, 214}
第一輪:
在這裏插入圖片描述
第二輪:
在這裏插入圖片描述
第三輪:
在這裏插入圖片描述
三輪代碼:

public static void radixSort(int[] arr) {
        //爲了防止數據溢出大小定義爲arr.length
        //明確空間換時間
        int[][] bucket = new int[10][arr.length];
        //bucketElementCount[0]就是 bucket[0]桶放入數據的個數
        int[] bucketElementCount = new int[10];
        //針對每個元素放到每個元素的桶中
        for (int j = 0; j < arr.length; j++) {
            int digitOfElement = arr[j] % 10;
            //放在對應的桶中
            bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];
            bucketElementCount[digitOfElement]++;
        }
        int index = 0;
        for (int k = 0; k < bucketElementCount.length; k++) {
            //如果桶中有數據,我們才放到原數組
            if (bucketElementCount[k] != 0) {
                //循環該桶
                for (int l = 0; l < bucketElementCount[k]; l++) {
                    arr[index++] = bucket[k][l];
                }
            }
            bucketElementCount[k] = 0;
        }
        System.out.println(Arrays.toString(arr));
        //=====================第二輪=======================
        //針對每個元素放到每個元素的桶中
        for (int j = 0; j < arr.length; j++) {
            int digitOfElement = arr[j] /10 % 10;
            //放在對應的桶中
            bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];
            bucketElementCount[digitOfElement]++;
        }
        index = 0;
        for (int k = 0; k < bucketElementCount.length; k++) {
            //如果桶中有數據,我們才放到原數組
            if (bucketElementCount[k] != 0) {
                //循環該桶
                for (int l = 0; l < bucketElementCount[k]; l++) {
                    arr[index++] = bucket[k][l];
                }
            }
            bucketElementCount[k] = 0;
        }
        System.out.println(Arrays.toString(arr));
        //=====================第三輪=======================
        //針對每個元素放到每個元素的桶中
        for (int j = 0; j < arr.length; j++) {
            int digitOfElement = arr[j] /100 % 10;
            //放在對應的桶中
            bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];
            bucketElementCount[digitOfElement]++;
        }
        index = 0;
        for (int k = 0; k < bucketElementCount.length; k++) {
            //如果桶中有數據,我們才放到原數組
            if (bucketElementCount[k] != 0) {
                //循環該桶
                for (int l = 0; l < bucketElementCount[k]; l++) {
                    arr[index++] = bucket[k][l];
                }
            }
            bucketElementCount[k] = 0;
        }
        System.out.println(Arrays.toString(arr));
}

運行結果:
在這裏插入圖片描述
結果和圖一樣但是代碼比較繁瑣,只有取位數是不一樣,我們可以優化。
優化後:

public static void radixSort(int[] arr) {
//最大值
        int max = arr[0];
        for (int i = 0; i <arr.length; i++) {
            if (arr[i] > max){
                max = arr[i];
            }
        }
        //爲了防止數據溢出大小定義爲arr.length
        //明確空間換時間
        int[][] bucket = new int[10][arr.length];
        //bucketElementCount[0]就是 bucket[0]桶放入數據的個數
        int[] bucketElementCount = new int[10];
        int maxLength = ("" + max).length();
        for (int ml = 0, n = 1; ml < maxLength; ml++, n *= 10){
            //針對每個元素放到每個元素的桶中
            for (int j = 0; j < arr.length; j++) {
                int digitOfElement = arr[j] / n % 10;
                //放在對應的桶中
                bucket[digitOfElement][bucketElementCount[digitOfElement]] = arr[j];
                bucketElementCount[digitOfElement]++;
            }
            int index = 0;
            for (int k = 0; k < bucketElementCount.length; k++) {
                //如果桶中有數據,我們才放到原數組
                if (bucketElementCount[k] != 0) {
                    //循環該桶
                    for (int l = 0; l < bucketElementCount[k]; l++) {
                        arr[index++] = bucket[k][l];
                    }
                }
                bucketElementCount[k] = 0;
            }
            System.out.println(Arrays.toString(arr));
        }
        }

基數排序80000數據測試80mm左右(根據個人電腦速度不一)

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