基数排序

基数排序

这个最有意思的一个排序算法

public class RadixSort {

    public static void main(String[] args) {
        int[] arr=new int[] {67,45,1,234,987,22,11,3};
        radixSort(arr);
        System.err.println(Arrays.toString(arr));
    }
    //有 0 ,1,2,3,4,5,6,7,8,9个桶   
    //依次按照个位、十位、百位...放入对应的桶
    //再一次取出
    //如此循环
    public static void radixSort(int[] arr) {
        //取出数组中最大数
        int max=Integer.MIN_VALUE;
        for(int i=0;i<arr.length;i++) {
            if(arr[i]>max) {
                max=arr[i];
            }
        }
        //缓存 保存每轮结果
        int[][] temp=new int[10][arr.length];
        //每个桶保存了几个数
        int[] counts=new int[10];
        //基数排序执行几轮有最大数的位数决定
        int maxLength=(max+"").length();
        for(int j=0,n=1;j<maxLength;j++,n*=10) {
            for(int k=0;k<arr.length;k++) {
                //个位数的数字、十位的数字...
                int digit=arr[k]/n%10;
                temp[digit][counts[digit]]=arr[k];
                counts[digit]++;
            }
            for(int[] aa:temp) {
                System.err.println(Arrays.toString(aa));
            }
            int index=0;
            //执行完一轮之后把数字按照顺序取出
            for(int m=0;m<10;m++) {
                //桶里有数取出
                if(counts[m]>0) {
                    //把桶里的数依次取出
                    for(int h=0;h<counts[m];h++) {
                        arr[index]=temp[m][h];
                        index++;
                    }
                    counts[m]=0;
                }
            }
        }
    }

}