基數排序
- 基數排序屬於“分配式排序”,又稱“桶子法”,就是通過鍵值的各個位的值,將排序的元素分配至某些“桶中”,達到排序的目的
- 基數排序屬於穩定性排序,基數排序是效率高的穩定性排序法
- 基數排序是穩定性排序的擴展
- 基數排序是1887年赫爾曼·何樂禮發明的。它是這樣實現的:將整數按照位數切割成不同的數字,然後按每個位數分別比較
基數排序的基本思想
- 將所有待比較數值統爲同樣的數位長度,數位較短的數前面補零。然後,從最低位來時,依次進行一次排序。這樣從低位排序一直到最高位排序完成以後,數列就變成一個有序序列
- 這樣說明,比較難理解,下面我們看一個圖文解釋,理解基數排序的步驟
基數排序代碼實現
public static void radixSort(int [] arr){
int max = arr[0];//假設第一個數就是最大值
for(int i = 1;i < arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
}
//最大數是幾位數
int maxLength = String.valueOf(max).length();
//定義二維數組模擬10個桶,每個桶就是一維數組
int [] [] bucket = new int [10] [arr.length];
//定義一維數組記錄進入桶中元素的數量
int [] bucketElementCounts = new int [10];
//接下來循環處理-循環的次數便是最大數的位數(n用於處理獲取個位十位百位等數字)
for(int i = 0,n = 1;i < maxLength;i++,n*10){
for(int j = 0;j < arr.length;j++){
//取出每一個元素對應的值
int digitOfElement = arr[j] / n % 10;
//放入對應的桶中
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement]++;
}
//按照這個桶的順序(一維數組的下標,依次取出數據,再放回原數組)
int index = 0;
for(int k = 0;k < bucketElementCounts.legth;k++){
if(bucketElementCounts[k] != 0){
for(int l = 0;l < bucketElementCounts[k];l++){
arr[index++] = bucket[k][l];
}
}
bucketElementCounts[k] = 0;//需要清零便於下次循環裏面沒有髒數據
}
}
}
基數排序的說明
- 基數排序是對傳統桶排序的擴展,速度很快
- 基數排序是空間換時間的方式,佔內存很大
- 基數排序時穩定
- 有負數時候需要參考其他文章
排序算法比較圖