我们回想一下我们小时候是怎么学习比较数字大小的?我们是先个位数,如果一个位数比另一个位数多,那这个数肯定更大。如果位数同样多,就按位数递减依次往下进行比较,哪个数在这一位上更大那就停止比较,得出这个在这个位上数更大的数字整体更大的结论。
基本思想
基数排序是桶排序的扩展,他的基本思想是:将整数按位切割成不同的数字,然后按每个位数分别比较。具体做法是:将所有待比较数值统一为同样的位数长度,数位较短的数前边补零。然后,从最低位开始,依次进行一次排序,这样从最低位排序一直到最高位排序完成后,就变成一个有序数列。
代码实现
public class RedixSort {
public static void main(String[] args) {
int[] arr = new int[] {60,1,15,2,4,103};
redixSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void redixSort(int[] arr) {
//求出数组中的最大值,看需要循环几次
int max = arr[0];
for(int i = 0;i<arr.length;i++) {
if(max<arr[i]) {
max = arr[i];
}
}
int maxLength = (max + "").length();
//定义一个二维数组,来当作桶
int[][] bucket = new int[10][arr.length];
//定义一个一维数组,来记录桶每一列有多少个数
int[] elementCount = new int[10];
int a = 1;
for(int m = 0; m < maxLength;m++) {
//讲arr中的数据放入桶中
for(int i = 0;i < arr.length;i++) {
int element = arr[i] / a % 10;
bucket[element][elementCount[element]] = arr[i];
elementCount[element] ++;
}
int index = 0;
for(int i = 0;i < 10;i++) {
for(int j = 0;j < elementCount[i];j++) {
arr[index] = bucket[i][j];
index ++;
}
elementCount[i] = 0;
}
a = a * 10;
}
}
}