基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。原理就是将数据求余数,将余数相同的按照一定顺序放在一列里面然后在根据这个顺序获取出来就可以了。
直接上代码测试
public class Test{
public static void main(String[] args) {
//排序的数组
int arr[] ={50,2,3,4,5,44,15,26,47,36,19,48,27,46}
int maxLenth =getMaxLenth(arr);
//定义一个二维数组封装arr数组中取余数的位置(也可以把10定义在后面看个人习惯)
int timeXDay[][] =new int[10][arr.length];
int resultSize[] =new int[10];
//遍历数组中最大长度的个数
for (int i =0, j =1; i < maxLenth; i++, j *=10) {
//对arr数组遍历将结果放置在二维数组中
for (int anArr : arr) {
//不可以写成arr[k] % (j*10)
int mod = anArr / j %10;
//这里面是将arr[k]的值赋值给二元数组mod行resultSize[mod]列的位置上
timeXDay[mod][resultSize[mod]] = anArr;
//resultSize[mod]结果的初始值是0
resultSize[mod]++;
}
int index =0;
//对获取的二维数组的结果从新放入arr[]数组中
for (int k =0; k < resultSize.length; k++) {
if (resultSize[k] !=0) {
//表明余数为k的时候此时有值,值得个数为resultSize[k]个
for (int l =0; l < resultSize[k]; l++) {
arr[index++] = timeXDay[k][l];
}
//将值赋值为0下次使用
resultSize[k] =0;
}
}
}
System.out.println(Arrays.toString(arr));
}
/**
* @param arr 遍历的数组
* @return 返回数组元素中长度最大的值的长度
*/
private static int getMaxLenth(int[] arr) {
if (null == arr || arr.length ==0) {
return 0;
}
//假设数组第一个值为最大值
int maxLength = arr[0];
for (int i =1; i < arr.length; i++) {
int s = Integer.toString(arr[i]).length();
//将数组中长度最大的赋值给maxLength
maxLength = maxLength > s ? maxLength : s;
}
return maxLength;
}
}