基数排序或者说是桶排序

基数排序的基本思路

521  123  496  333  224

假设有这几个数

排序的基本过程是

先获取这五个数各位上的数,根据数对号入桶(所以需要十个桶子,0~9的下标分别对应这是存放数字几的桶子)

第一次:

521入一号桶  123入三号桶  496入6号桶  333入三号桶  224入4号桶

再分别将0~9号桶中的数据取出   521  333  123  496  224

第二次:十位入桶

521 123 224 333 496  ———》  224  123  521  333  496

第三次:百位入桶

123 224 333 496 521 ———》   123  224  333  496  521

    public static void radixSort(int [] array){
        //根据每一遍的结果可以知道,要先获得最大数的长度
        int max = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[max] < array[i]){
                max = i;
            }
        }
        int maxLength = (array[max] + "").length();
        //用一个二维数组来当桶子存放数据,行从上到下存放数据,列就表示各个位的数对对应桶子
        //各个位的数字的范围是0~10 ,每个桶子最多存放array.length个数据
        int [] [] temp = new int[10][array.length];
        //先从第一轮排序的情况分析
        //count用来记录每个桶子中存放的数据的个数,count[0]对应的数字就是桶子0中的元素个数...
        int [] count = new int [10];
        //遍历数组,根据个位信息对号入桶
        int n = 0;
        int k = 1;
        while (n < maxLength){
            for (int value : array) {
                int number = value / k % 10;
                temp[number][count[number]] = value;
                count[number]++;
            }
            //全部对号入桶之后再将入桶的数据全部取出
            int index = 0;
            for (int i = 0; i < 10; i++) {
                if (count[i] != 0){
                    for (int j = 0; j < count[i]; j++) {
                        array[index++] = temp[i][j];
                    }
                    count[i] = 0;
                }
            }
            k *= 10;
            n ++;
        }
    }
原文地址:https://www.cnblogs.com/zzxisgod/p/13336075.html