八大排序算法~基数排序(桶排序)
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++; } }