1.什麼是基數排序
基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定性的排序,其時間複雜度爲O (nlog(r)m),其中r爲所採取的基數,而m爲堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
2.基數排序圖解
3.基數排序代碼實現
public static void radixSort(int[] nums) {
int len = nums.length;
int die = 10;
int dividend = 1;
Map<Integer, List<Integer>> map = new HashMap<>();
int max = 0;
do {//循環比較位數 個十百千萬。。。
for (int i = 0; i < len; i++) {
if (nums[i] > max) {
max = nums[i];
}
int positionNum = nums[i] % die / dividend;
List<Integer> list = map.getOrDefault(positionNum, new ArrayList<>());
list.add(nums[i]);
map.put(positionNum, list);
}
//比較位數後 除數 跟模均乘10
die *= 10;
dividend *= 10;
//將排序的字段賦值回數組
int index = 0;
int nums_Index = 0;
while (index < 10) {
List<Integer> list = map.getOrDefault(index, new ArrayList<>());
for (Integer integer : list) {
nums[nums_Index++] = integer;
}
map.remove(index);
index++;
}
} while (dividend <= max);//當除數大於最大值後 不在繼續
}
4.基數排序的效率
初看起來 ,基數排序的執行效率似乎好得讓人無法相信 。所有要做的只是把原始的數據項從數 組複製到鏈表 ,然後再複製回去 。如果有 IO 個數據項 ,則有 20 次複製。對每一位重複這個過程 。假設對 5 位的數字排序 ,就需要 20*5,等於100 次複製。如果有100 個數據項 ,那麼就有 200*5 等於 1000 次複製 。複製的次數和數據項的個數成正比 ,即 O(N) ,這是我們看到的效率最高的排序 算法 。
不幸的是 ,一般是這樣 :只要數據項越多 ,就需要越長的關鍵字 。如果數據項增加 10 倍 ,那 麼關鍵字就需要再增加另一位 。複製的次數是和數據項的個數與關鍵字的位數的乘積成正比 。位數 是關鍵字值的對數 ,因此在絕大多數的情況下 ,算法的執行效率倒退爲 O(N*logN),和快速排序算 法相同 。
儘管從數字中提取出每一位需要花費時間 ,但是沒有比較。每兩次複製需要一次位提取。然而, 一臺給定的計算機在二進制中的位提取操作快於比較操作 。當然,與歸併排序類似 ,基數排序所需 要的存儲空間是快速排序的二倍 。