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)
- 穩定性:穩定性排序
- 非原地排序