class Solution {
public int[] sortArray(int[] nums) {
// 基数排序(实现负数和正数的排序),空间换时间
int max = nums[0];
int min = nums[0];
for (int i = 1; i < nums.length; i++) {
max = nums[i] > max ? nums[i] : max;
min = nums[i] < min ? nums[i] : min;
}
//确定最大位是什么?(个、十、百。。。)
int maxLength = (max + "").length() > (min + "").length() ? (max + "").length() : (min + "").length();
// 定义一个二维数组
int[][] bucket = new int[10][nums.length];
int[] count = new int[10];// 记录每个桶中元素的个数
//将数组中所有的数加上最小值的绝对值,变成正数
for(int i =0;i<nums.length;i++){
nums[i] += Math.abs(min);
}
for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
for (int j = 0; j < nums.length; j++) {
int element = nums[j] / n % 10;
// 放入对应的桶中
bucket[element][count[element]] = nums[j];
count[element]++;
}
int index = 0;
for (int k = 0; k < count.length; k++) {
if (count[k] != 0) {// 说明第k个桶内有数据
for (int l = 0; l < count[k]; l++) {// 说明第k个桶内有count[k]个数据
nums[index] = bucket[k][l];
index++;
}
}
count[k] = 0;// 将10个筒内数据的个数清零
}
}
//变回原来的数组
for(int i =0;i<nums.length;i++){
nums[i] -= Math.abs(min);
}
return nums;
}
}