基本思想
構造一個10*n的二維數組,一個長度爲n的數組用於存儲每次位排序時每個桶子裏有多少個元素。
從低位開始,將所有元素放到對應的桶子(對應二維數組那一列),然後將所有元素按桶子編號拿出來,組成新數組,然後按高位處理。
代碼
public class RadixSort {
public static void radixSort(int[] arr, int d) {
int n = 1;// 代表位數對應的數:1,10,100...
int k = 0;// 保存每一位排序後的結果用於下一位的排序輸入
int length = arr.length;
int[][] bucket = new int[10][length];// 排序桶用於保存每次排序後的結果,這一位上排序結果相同的數字放在同一個桶裏
int[] order = new int[10];// 用於保存每個桶裏有多少個數字
while (n < d) {
for (int num : arr) { // 將數組arr裏的每個數字放在相應的桶裏
int digit = (num / n) % 10;
bucket[digit][order[digit]] = num;
order[digit]++;
}
for (int i = 0; i < 10; i++) {// 將前一個循環生成的桶裏的數據覆蓋到原數組中用於保存這一位的排序結果
if (order[i] != 0) {// 這個桶裏有數據,從上到下遍歷這個桶並將數據保存到原數組中
for (int j = 0; j < order[i]; j++) {
arr[k] = bucket[i][j];
k++;
}
}
order[i] = 0;// 將桶裏計數器置0,用於下一次位排序
}
n *= 10;
k = 0;// 將k置0,用於下一輪保存位排序結果
}
}
public static void main(String[] args) {
int[] a = new int[] { 49, 38, 65, 97, 76, 13, 27, 50 };
radixSort(a, 100);
for (int i : a)
System.out.print(i + " ");
}
}
時間複雜度
O(d(r+n))