基本思想
基数排序是桶排序的扩展,他的基本思想是:将整数按位切割成不同的数字,然后按每个位数分别比较。
方法
具体做法是:将所有待比较数值统一为同样的位数长度,数位较短的数前边补零。然后,从最低位开始,依次进行一次排序,这样从最低位排序一直到最高位排序完成后,就变成一个有序数列。
图示
代码
public static void main(String[] args){
int[] arr = new int[]{587,956,12,47,30,20,15,11,21,31,57,91,35,120};
sort(arr);
System.out.println("排序后结果为:"+Arrays.toString(arr));
}
public static void sort(int[] arr){
// 找到数组当中最大值
int max = arr[0];
for (int i = 0; i < arr.length; i++){
if (arr[i] > max){
max = arr[i];
}
}
//确定最大值得位数
int maxLength = (max + "").length();
//定义一个二维数组
int[][] bucket = new int[10][arr.length];
//定义一个以为数组用来记录
int[] elementCount = new int[10];
//第一轮进行个位的处理
int n = 1;
// 执行 150 150 / 1 = 150 % 10 = 0
for (int h = 0; h <maxLength; h++){
for (int i = 0;i < arr.length; i++){
// 取出数组当中的每一个元素,获取每一个元素的个位值
int element = arr[i] / n % 10;
// 放入通当中去
bucket[element][elementCount[element]] = arr[i];
elementCount[element]++;
}
// 将桶内的数据放回到原数组当中
// 知道每一个桶内有多少元素
int index = 0;
for (int k = 0;k < elementCount.length; k++){
//2.根据我们已经知道的桶内的元素的个数对桶进行遍历
for (int l = 0;l < elementCount[k]; l++){
arr[index] = bucket[k][l];
index++;
}
//清空桶的记录
elementCount[k] = 0;
}
n = n * 10;
}
}