/** * 基數排序:n個d位元進行排序,先從最低有效位進行,由於每位元字都界於0到9(只考慮整數), * 可以用計數排序對每一位進行排序,重複這一過程直到對所有的d位元字都進行了排序。 * 由於計數排序的複雜度為O(n+k),所以基數排序的時間複雜度為O(d(n+k)) */public class RadixSort {/** * 用計數排序將arr數組按第i位排序 * @param arr 要排序的數組 * @param i 第i位 */static void countingSort(int arr[],int i){//存放arr中每個元素第i位的值int a[] = new int[arr.length];//b數組存放arr中現在的值,把排序結果放在 arr數組中int b[] = new int[arr.length];//c儲存從0到9每個元素在a中出現的次數,故c的長度為10。int c[] = new int[10];//把arr中的元素放到b數組中for(int j = 0;j<arr.length;j++){b[j] = arr[j];}//計算每個元素第i位的值,然後放入a數組中for(int j = 0;j<b.length;j++){int temp = (int)Math.pow(10, i);int r = b[j]%temp;if(i>1){int x = (int)Math.pow(10, (i-1));r=r/x;}a[j]=r;}//c[j]中存放了等於j的元素的個數for(int j = 0;j<a.length;j++){c[a[j]]++;}//c[j]存放小於或等於j的元素個數for(int j = 1;j<10;j++){c[j]+=c[j-1];}//由於c[r]存放小於等於r的元素個數(r=a[j]),所以r應該放在arr數組中的c[r]位置(由於數組從0開始,所以要減1)for(int j = a.length-1;j>=0;j--){int r = a[j];arr[c[r]-1] = b[j];//每次c[r]減1可以保證下一個等於r的相同元素,落在arr[c[r]-1]的前一個位置c[r]--;}}/** * 外層排序演算法,從最低有效位到d有效位,逐位進行排序 * @param arr 數組 * @param d d代表 每個數是幾位元 */static void radixSort(int arr[],int d){for(int i = 1;i<=d;i++)countingSort(arr,i);}//測試.....public static void main(String args[]){int arr[] = {329,457,657,839,436,720,355};radixSort(arr,3);for(int i = 0;i<arr.length;i++)System.out.println(arr[i]);}}