将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。
这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
public static void radixSort(int[] arr) { //得到最大位数 int max = arr[0]; for (int value : arr) { if (value > max) max = value; } int maxLength = (max + "").length(); //定义二维数组,表示十个桶,每个桶是一个一维数组 int[][] bucket = new int[10][arr.length]; //记录每个桶中放入数据个数 //bucketElementCounts[0]就是bucket[0]中数据个数 int[] bucketElementCounts = new int[10]; //循环次数=最大位数 for (int i = 0, n = 1; i < maxLength; i++, n *= 10) { //按每位上的数进行排序 for (int j = 0; j < arr.length; j++) { //取出数 int digitOfElement = arr[j] / n % 10; //放入桶中 bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j]; bucketElementCounts[digitOfElement]++; } //取出数据放入数组 int index = 0; //遍历每一个桶,桶中数据放入原数组 for (int k = 0; k < bucketElementCounts.length; k++) { if (bucketElementCounts[k] != 0) { for (int l = 0; l < bucketElementCounts[k]; l++) { arr[index++] = bucket[k][l]; } } //清空数据,下一次循环使用 bucketElementCounts[k] = 0; } } }