基數排序是按照低位先排序,然後收集;再按照高位排序,然後再次收集;依次類推,直到最高位。有時候有些屬性是有優先級順序,先按照低優先級排序,再按照高優先級排序。最後的次序就是高優先級的在前,高優先級相同的低優先級高的在前。
- 算法描述:
- 取得數組中的最大數,並取得位數;
- Arrays爲原始數組,從低位開始取到每個位組成radix數組;
- 對redix進行計數排序(利用計數排序適用於小範圍數的特點)
- 代碼
private static void jiShu(int[] arrays) {
// 先按照基數排序,也就是個位上數值大小
int[][] arrayss = new int[10][];
for (int i = 0; i < arrays.length; i++) {
String s = String.valueOf(arrays[i]);
int ge = Integer.parseInt(s.substring(s.length() - 1, s.length()));
if (arrayss[ge] == null) {
arrayss[ge] = new int[1];
arrayss[ge][0] = arrays[i];
} else {
int[] temp = new int[arrayss[ge].length + 1];
zhuanyiShuZu(arrayss[ge], temp);
temp[arrayss[ge].length] = arrays[i];
arrayss[ge] = temp;
}
}
// 將二維數組轉換爲一維數組
for (int i = 0, a = 0; i < arrayss.length; i++) {
if (arrayss[i] != null) {
for (int j = 0; j < arrayss[i].length; j++) {
arrays[a++] = arrayss[i][j];
}
}
}
// 按照最高位大小排序
arrayss = new int[10][];
for (int i = 0; i < arrays.length; i++) {
String s = String.valueOf(arrays[i]);
int gao = Integer.parseInt(s.substring(0, 1));
if (arrayss[gao] == null) {
arrayss[gao] = new int[1];
arrayss[gao][0] = arrays[i];
} else {
int[] temp = new int[arrayss[gao].length + 1];
zhuanyiShuZu(arrayss[gao], temp);
temp[arrayss[gao].length] = arrays[i];
arrayss[gao] = temp;
}
}
// 將二維數組轉換爲一維數組
for (int i = 0, a = 0; i < arrayss.length; i++) {
if (arrayss[i] != null) {
for (int j = 0; j < arrayss[i].length; j++) {
arrays[a++] = arrayss[i][j];
}
}
}
}
private static void zhuanyiShuZu(int[] arrays1, int[] arrays2) {
for (int i = 0; i < arrays1.length; i++) {
arrays2[i] = arrays1[i];
}
}
- 基數排序是基於分別排序,分別收集,所以是穩定的,但是基數排序的性能要比桶排序要略差,每一次關鍵字的桶分配都需要O(n)的時間複雜度,而且分配之後得到的新的關鍵字序列又需要O(n)的使勁複雜度。假如待排序數據可以分爲d個關鍵字,則基數排序的時間複雜度將是O(d*2n),當然基本上還是線性級別的。基數排序的空間複雜度爲O(n+k),其中k爲桶的數量。一般來說n>>k,因此額外空間還是需要大概n個。