為推廣 Stadia 雲遊戲,谷歌將手柄和 Chromecast 組合出售:99.99 美元
阿新 • • 發佈:2021-08-01
簡介
基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度為O (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
圖解
程式碼
public static void radixSort(int[] arr) { int[] nums = new int[10]; int[][] bucket = new int[10][arr.length]; int element; for (int j : arr) { element = j % 10; bucket[element][nums[element]] = j; nums[element]++; } int index = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { for (int j = 0; j < nums[i]; j++) { arr[index++] = bucket[i][j]; } } nums[i] = 0; } System.out.println("第一輪======"+Arrays.toString(arr)); for (int j : arr) { element = j /10 % 10; bucket[element][nums[element]] = j; nums[element]++; } index = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { for (int j = 0; j < nums[i]; j++) { arr[index++] = bucket[i][j]; } } nums[i] = 0; } System.out.println("第二輪======"+Arrays.toString(arr)); for (int j : arr) { element = j /100 % 10; bucket[element][nums[element]] = j; nums[element]++; } index = 0; for (int i = 0; i < nums.length; i++) { if (nums[i] != 0) { for (int j = 0; j < nums[i]; j++) { arr[index++] = bucket[i][j]; } } nums[i] = 0; } System.out.println("第三輪======"+Arrays.toString(arr)); }
測試
int[] arr = { 26, 5, 317, 548, 64, 114};
radixSort(arr);
根據上面的程式碼可以得到以下程式碼
public static void radixSort2(int[] arr) { int[] nums = new int[10]; int[][] bucket = new int[10][arr.length]; int element; int maxIndex = 0; int index = 0; for (int i = 1; i < arr.length; i++) { if (arr[maxIndex] < arr[i]) { maxIndex = i; } } int maxLength = (arr[maxIndex] + "").length(); for (int i = 0,n = 1; i < maxLength; i++,n *= 10) { for (int j : arr) { element = j /n % 10; bucket[element][nums[element]] = j; nums[element]++; } index = 0; for (int j = 0; j < nums.length; j++) { if (nums[j] != 0) { for (int k = 0; k < nums[j]; k++) { arr[index++] = bucket[j][k]; } } nums[j] = 0; } System.out.println("第三輪======"+Arrays.toString(arr)); } }
測試
int[] arr = { 26, 5, 317, 548, 64, 114};
radixSort2(arr);
可以發現結果是一樣的