一、基數排序思想
相比其它排序,主要是利用比較和交換,而基數排序則是利用分配和收集兩種基本操作。基數 排序是一種按記錄關鍵字的各位值逐步進行排序的方法。此種排序一般適用於記錄的關鍵字為整數類型的情況。所有對於字符串和文字排序不適合。
實現:將所有待比較數值(自然數)統一為同樣的數位長度,數位較短的數前面補零。然后,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以后, 數列就變成一個有序序列。
基數排序的兩種方式:
- 高位優先,又稱為最有效鍵(MSD),它的比較方向是由右至左;
- 低位優先,又稱為最無效鍵(LSD),它的比較方向是由左至右;
二、圖解
三、代碼實現
/** * 基數排序演示 * * @author Lvan */ public class RadixSort { public static void main(String[] args) { int[] arr = {63, 157, 189, 51, 101, 47, 141, 121, 157, 156, 194, 117, 98, 139, 67, 133, 181, 12, 28, 0, 109}; radixSort(arr); System.out.println(Arrays.toString(arr)); } /** * 高位優先法 * * @param arr 待排序列,必須為自然數 */ private static void radixSort(int[] arr) { //待排序列最大值 int max = arr[0]; int exp;//指數 //計算最大值 for (int anArr : arr) { if (anArr > max) { max = anArr; } } //從個位開始,對數組進行排序 for (exp = 1; max / exp > 0; exp *= 10) { //存儲待排元素的臨時數組 int[] temp = new int[arr.length]; //分桶個數 int[] buckets = new int[10]; //將數據出現的次數存儲在buckets中 for (int value : arr) { //(value / exp) % 10 :value的最底位(個位) buckets[(value / exp) % 10]++; } //更改buckets[i], for (int i = 1; i < 10; i++) { buckets[i] += buckets[i - 1]; } //將數據存儲到臨時數組temp中 for (int i = arr.length - 1; i >= 0; i--) { temp[buckets[(arr[i] / exp) % 10] - 1] = arr[i]; buckets[(arr[i] / exp) % 10]--; } //將有序元素temp賦給arr System.arraycopy(temp, 0, arr, 0, arr.length); } } }


