我们先按个位排,再根据十位数排,直到所有元素有序。有10个桶,分别用来存放某一位上数字为0-9的元素。找到数组中的最大值,它的位数决定了外循环次数。
把各个元素按照个位数放入对应的桶里,并用一个count[]记录每个桶里放了几个元素,全部放完以后, 把元素按顺序取出,(从第0个桶到第9个桶,每个桶里先放进去的先取出来),放到原数组里;
再根据十位数重复上面的过程,重复的次数由最大值的位数决定,循环结束以后数组有序。
public void sort(int[] arr){
int len = arr.length;
int[][] bucket = new int[10][len]; //桶
int[] count = new int[10]; //记录每个桶每次放几个数
int max = arr[0]; //数组中的最大值
for (int i = 1; i < arr.length; i++){
if (arr[i] > max){
max = arr[i];
}
}
int m = (max + "").length();
int n = 0;
int n1 = 1;
while(n < m){
for (int i = 0; i < len; i++){
int r = arr[i] / n1 % 10;
bucket[r][count[r]] = arr[i];
count[r]++;
}
n++;
n1 = n1 * 10;
int k = 0;
for (int i = 0; i < 10; i++){
for (int j = 0; j < count[i]; j++){
arr[k] = bucket[i][j];
k++;
}
count[i] = 0;
}
}
}