java排序演算法(九)------基數排序
阿新 • • 發佈:2018-12-11
基數排序
程式碼實現:
public class RadixSort {
public static void sort(int[] a) {
int digit = 0;// 陣列的最大位數
for (int i : a) {
// 獲取陣列中數的最大位數
digit = Math.max(digit, String.valueOf(i).length());
}
int k = 0;// 使用者記錄排序陣列的索引
int m = 1;// 當前的位數,個位用1表示,十位用2表示,以此類推
int n = 1;// 用來表示當前位數的整數倍
int type = 10;// 將餘數從0-9分為10種類型
int[][] temp = new int[type][a.length];// 第一維用來儲存餘數,第二維用來儲存餘數對應的陣列值
int[] order = new int[type];// 使用者第二維陣列值得索引計數
while (m <= digit) {
// 遍歷陣列中的每個元素,以當前位數依據餘數進行歸類
for (int i = 0; i < a. length; i++) {
int r = (a[i] / n) % 10;// 當前數值在當前位數的餘數
temp[r][order[r]] = a[i];// 第一次為temp[r][0],第二次為temp[r][1]......
order[r]++;
}
// 遍歷二維陣列的第一維
for (int i = 0; i < type; i++) {
if (order[i] != 0) {// 當order[i]==0時,說明order[r]++沒有執行,temp[r][]中沒有儲存陣列值
// 遍歷二維陣列的第二維
for (int j = 0; j < order[i]; j++) {// order[i]表示當前i餘數的型別儲存的陣列值的個數
a[k] = temp[i][j];
k++;
}
}
order[i] = 0;
}
k = 0;// 排序陣列索引初始化
m++;// 當前位數個數的索引
n *= 10;// 當前位數向前推
}
}
public static void sort2(int[] arr){
int max = 0;
//獲得最大位數
for(int i: arr){
max = Math.max(max, String.valueOf(i).length());
}
int type = 10;
//臨時陣列
int[][] temp = new int[type][arr.length]; // 第一維用來儲存餘數,第二維用來儲存餘數對應的陣列值
int[]order = new int[type]; // 用第二維陣列值得索引計數
int k = 0; //記錄當前陣列索引
int m = 1; //當前位數整數倍,個位為1,十位為10,百位為100
int n = 1; //// 當前的位數,個位用1表示,十位用2表示,以此類推
while(n <= max){
//裝桶
// 遍歷陣列中的每個元素,以當前位數依據餘數進行歸類
for(int i = 0;i < arr.length;i ++){
int x = arr[i] / m % 10; // 當前數值在當前位數的餘數
temp[x][order[x]] = arr[i]; // 第一次為temp[r][0],第二次為temp[r][1]......
order[x] ++;
}
//倒桶
for(int i = 0;i < type;i ++){
if(order[i] != 0){ // 當order[i]==0時,說明order[r]++沒有執行,temp[r][]中沒有儲存陣列值
for(int j = 0;j < order[i];j ++){ // order[i]表示當前i餘數的型別儲存的陣列值的個數
arr[k] = temp[i][j];
k++;
}
order[i] = 0;
}
}
m = m * 10; // 排序陣列索引初始化
k = 0; // 當前位數個數的索引
n ++; // 當前位數向前推
}
}
}