十大排序算法-------【基数排序】详解(Java源码)
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再次收集;依次类推,直到最高位。有时候有些属性是有优先级顺序,先按照低优先级排序,再按照高优先级排序。最后的次序就是高优先级的在前,高优先级相同的低优先级高的在前。
- 算法描述:
- 取得数组中的最大数,并取得位数;
- 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个。