0
点赞
收藏
分享

微信扫一扫

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

源码之路 2022-06-05 阅读 61

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

1,思路:分配+收集:

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

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

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

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

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

2,图解:八大排序算法~基数排序(桶排序)_i++

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

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

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

 

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

第三趟排序后结果: (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++;
}
}

 

 

 

 


作者:一乐乐​


举报

相关推荐

0 条评论