通用算法 -[排序算法] - 基數排序

1、算法思想

基數排序的排序思路是這樣的:先以個位數的大小來對數據進行排序,接着以十位數的大小來多數進行排序,接着以百位數的大小……

排到最後,就是一組有序的元素了。不過,他在以某位數進行排序的時候,是用“桶”來排序的。

由於某位數(個位/十位….,不是一整個數)的大小範圍爲0-9,所以我們需要10個桶,然後把具有相同數值的數放進同一個桶裏,之後再把桶裏的數按照0號桶到9號桶的順序取出來,這樣一趟下來,按照某位數的排序就完成了

爲方便理解我還準備了動圖:
在這裏插入圖片描述

2、代碼實現

public class RadioSort {
    public static int[] radioSort(int[] arr) {
        if(arr == null || arr.length < 2) return arr;

        int n = arr.length;
        int max = arr[0];
        // 找出最大值
        for (int i = 1; i < n; i++) {
            if(max < arr[i]) max = arr[i];
        }
        // 計算最大值是幾位數
        int num = 1;
        while (max / 10 > 0) {
            num++;
            max = max / 10;
        }
        // 創建10個桶
        ArrayList<LinkedList<Integer>> bucketList = new ArrayList<>(10);
        //初始化桶
        for (int i = 0; i < 10; i++) {
            bucketList.add(new LinkedList<Integer>());
        }
        // 進行每一趟的排序,從個位數開始排
        for (int i = 1; i <= num; i++) {
            for (int j = 0; j < n; j++) {
                // 獲取每個數最後第 i 位是數組
                int radio = (arr[j] / (int)Math.pow(10,i-1)) % 10;
                //放進對應的桶裏
                bucketList.get(radio).add(arr[j]);
            }
            //合併放回原數組
            int k = 0;
            for (int j = 0; j < 10; j++) {
                for (Integer t : bucketList.get(j)) {
                    arr[k++] = t;
                }
                //取出來合併了之後把桶清光數據
                bucketList.get(j).clear();
            }
        }
        return arr;
    }
}

3、算法分析

  • 時間複雜度:O(kn)
  • 空間複雜度:O(n+k)
  • 穩定性:穩定性排序
  • 非原地排序
發佈了155 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章