原数组和桶如下:
第一次按照个位排序如下
取出的时候按照从0~9的顺序,且同一个桶中,先放进去的先出来
第二次按照十位排序如下
取出结果如下
第三次次按照百位排序如下
取出结果如下:
此时数组已经有序了
代码思路:
我们排序的次数取决于数组中最大是数字的位数
import java.util.Arrays; //基数排序 public class RadixSort { public static void main(String[] args) { int[] arr = { 23, 6, 189, 45, 9, 287, 56, 1, 798, 34, 65, 652, 5 }; radixSort(arr); System.out.println(Arrays.toString(arr)); } public static void radixSort(int[] arr) { //先找到这个数组里面最大的数字 //排多少轮,取决于数组中最大的数字是几位数 int max=arr[0]; for(int i=1;i<arr.length;i++) { if(arr[i]>max) { max = arr[i]; } } // System.out.println(max); //计算取到的最大值max是几位数:把max变成字符串类型,然后计算其长度 String maxs = ""; maxs = maxs+max; int maxLen = maxs.length(); // System.out.println(maxLen); //用于临时存放数据的数组(那0-9的十个桶) int[][] temp = new int[10][arr.length]; //用于记录temp中每一个桶中存放数据的数量 int[] count =new int[10]; //根据最大长度决定比较的次数 for(int i= 0, n=1;i<maxLen;i++,n=n*10) { //取出数组中每个数字的余数 for (int j = 0; j < arr.length; j++) { int ys = arr[j]/n%10; temp[ys][count[ys]] = arr[j];//关键是放在第几列,需要用一个数组辅助计算 count[ys]++; } // if (i==0) { // for (int[] temps : temp) { // System.out.println(Arrays.toString(temps)); // } // System.out.println(Arrays.toString(count)); // } // int index =0; //把数字取出来,看count[]数组(记录数量)中的个数,如果个数=0,就不取 for(int k=0;k<10;k++) { if(count[k]!=0) { //遍历temp[][]数组 for(int l =0;l<count[k];l++) { arr[index++]=temp[k][l]; } } //把数量置为0 count[k]=0; } } } }