基本介紹 基數排序屬於“分配式排序”,它通過元素的各個位的值,將元素放置對應的“桶”中 基數排序屬於穩定性排序,效率高,但是過多的元素會出現虛擬機運行記憶體的不足(千萬個元素) 基本思想 把元素統一為同樣長度的數組長度 元素較短的數前面補0,比如(1 15 336 看成 001 015 336) 然後 ...
-
基本介紹
基數排序屬於“分配式排序”,它通過元素的各個位的值,將元素放置對應的“桶”中
基數排序屬於穩定性排序,效率高,但是過多的元素會出現虛擬機運行記憶體的不足(千萬個元素)
-
基本思想
把元素統一為同樣長度的數組長度 元素較短的數前面補0,比如(1 15 336 看成 001 015 336)
然後從最低位開始,以此進行排序。
-
代碼實現
// 桶 10個桶 每個桶的最大容量預設為數組長度
int[][] bucket = new int[10][str.length];
// 每個桶的當前容量
int[] capacity = new int[10];
//元素求出最大數
int max = str[0];
for (int r = 0; r < str.length; r++) {
if (str[r] > max) {
max = str[r];
}
}
//求出最大長度 用於判斷迴圈幾大輪
int length = (max + "").length();
//取得(個位 十位 百位。。。。)基數
for (int b= 0,u=1; b < length; b++,u*=10) {
for (int i = 0; i < str.length; i++) {
int base = str[i] /u % 10; //比如基數為 4
//將基數按照規則放進桶中
bucket[base][capacity[base]] = str[i]; //放進第四個桶中 的第一幾個當前容量位置
capacity[base]++; //容量增加
}
// 取出數據
int d = 0;
for (int k = 0; k < capacity.length; k++) {
if (capacity[k] != 0) {
for (int p = 0; p < capacity[k]; p++) {
str[d] = bucket[k][p];
d++;
}
}
//註意:清零
capacity[k] = 0;
} }
}