写里一个基数排序:
/**
* 基数排序
* @param arr
*/
public static void radioSort(int[] arr) {
// 首先找到最大的数
int maxNum = Integer.MIN_VALUE;
for (int i = 0; i< arr.length; i++) {
if (maxNum < arr[i]) {
maxNum = arr[i];
}
}
// 求出最大的数的位数,这样才能知道基数排序需要排几次
int ddcount = String.valueOf(maxNum).length();
// 进行归并排序,最外层循环是归并排序的次数, n用来记录当前排序的位数,比如当n=1时,排序的是个位,n = 10时排序的是十位。。。
for(int i = 0, n = 1; i < ddcount; i++, n*=10) {
// 这里是归并排序的桶,用一个二维数组来实现,一共10个桶,每个桶中最多可以放arr.length个数字
int[][] temp = new int[arr.length][10];
// 这是每个桶中当前数字的个数的数组
int[] counts = new int[10];
// 这里需要遍历所有数组元素,取出来完成归并排序
for(int j = 0; j < arr.length; j++) {
// 取出每个数的对应位
int num = (arr[j] /n)% 10;
temp[counts[num]][num] = arr[j];
counts[num]++;
}
// 完成一轮排序之后,需要按顺序取出来放到arr数组中
int index = 0;
for(int j = 0; j < 10; j++) {
// 对应的counts位不为0,说明这个桶里有数据
if (counts[j] != 0) {
for (int k = 0; k < counts[j]; k++) {
arr[index++] = temp[k][j];
}
// 把桶中的数据复制到arr数组中后, 把桶中的数组个数清零。
counts[j] = 0;
}
}
}
}```
Q.E.D.