八大排序算法~基数排序(桶排序)

八大排序算法~基数排序(桶排序)

1,思路:分配+收集:

将关键字为k的记录放到第k个桶~分配!【关键字~就是待排数的位数

按序号将非空的桶中数据进行连接~收集!

待排数据要从小到大进行排序~~ 个位数开始从小到大排序~按照个位数将待排数据装到对应的桶号里;

                                        ~~ 十位数开始从小到大排序~按照十位数将待排数据装到对应的桶号里;

                ~~ 百位数开始从小到大排序~按照百位数将待排数据装到对应的桶号里;

2,图解:

 第一趟排序后结果: (790,611,101,532,214,735,945,486,306

 第二趟排序后结果: (101,306,611,214,735,532,945,486,790

 

 第三趟排序后结果: (101,214,306,486,532,611,735,790,945

3,代码:

 public static void sort(int[] number, int d){   //d 表示最大数的位数
        int k = 0;   //用于数组索引的更新
        int n = 1;   //控制n的10倍数,以获取“模数”
        int m = 1;  //控制键值排序依据的是哪一位
        int[][] temp = new int[10][number.length];//数组的第一维表示余数的可能范围是0-9
        int[] order = new int[10]; //表示当前某个桶中的个数
        while(m <= d){
            for(int i = 0; i < number.length; i++){
                int lsd = ((number[i] / n) % 10);
                temp[lsd][order[lsd]] = number[i];
                order[lsd]++;
            }
            //根据经过“个位排序(或者是十位排序或百位排序)”桶中装的数拷贝到number中
            for(int i = 0; i < 10; i++){
                if(order[i] != 0){
                    for(int j = 0; j < order[i]; j++){
                        number[k] = temp[i][j];
                        k++;
                    }
          } order[i]
= 0; } n *= 10; k = 0; m++; } }

 

 

 

 

 

posted @ 2021-07-25 23:59  一乐乐  阅读(239)  评论(0编辑  收藏  举报