package Sort;
import java.util.Arrays;
/*
基数排序:“桶排序”扩展
思路:使用一个 二维数组bucket[][]模拟10个桶(二维数组的行表示桶的个数,列表示桶的大小),
再用一个一位数组bucketCount[]记录每个桶中每次插入的元素
先找出数组中最大的数,即位数最多的,它决定了循环的次数
第一轮:比较个位上的数:个位上的数可能为0 - 9 中的任意一个,将原数放入对应的桶中,
如,10-->(0-->(10)-->0号桶),11-->(1-->(11)-->1号桶),以此类推 ....
第二轮:比较十位上的数,没有则为零,也是根据百位上的数 对应 桶
第三轮:比较百位上的数,没有则为零,..............
.....
//典型的 以空间换时间
*/
public class radixSort {
public static void main(String[] args) {
//待排序的数组
//int [] arr = new int[10];
int [] arr = {2,1,13,24,65,30,47};
radixSort(arr);
System.out.println(Arrays.toString(arr));
}
//基数排序算法
public static void radixSort(int [] arr){
//一个二维数组 包含十个一维数组--> 十个桶
//行表示第几个桶,列表示桶的大小
int [][] bucket = new int[10][arr.length];
//定义一个一维数组,记录十个桶中每个桶存放的元素的个数
int [] bucketCount = new int[10];
//第一步,获取数组的最大的数-->得到位数
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i] > max){
max = arr[i];
}
}
//得到最大的位数长度
int maxLength = (max+"").length();
//开始循环遍历
int base = 1;//用的得到每一位上的数
for (int i = 0; i < maxLength; i++,base *= 10) {
for (int k = 0; k < arr.length; k++) {
int digit = ( arr[k] / base ) % 10;//得到每一位上的数
//放到对应的桶中
bucket[digit][ bucketCount[digit] ] = arr[k];
bucketCount[digit]++;//对应桶中存放的个数 + 1
}
//此时,已经把所有元素放入桶中
//然后,从桶0 - 9 按顺序取出桶中的元素,重新放入arr中
int index = 0;//记录arr的下标
for (int j = 0; j < bucketCount.length; j++) {//遍历10个桶
//从第0个桶开始
if(bucketCount[j] != 0){//桶里面放有元素,共bucketCount[j]个
//循环拿出来
for(int h = 0; h < bucketCount[j]; h++){
arr[index] = bucket[j][h];//第j个桶的第h个元素
index++;
}
//取完第j个桶的元素后,把它的长度置为0,特别注意这一点细节
bucketCount[j] = 0;
}
}
}
}
}
数据结构排序算法之基数排序(桶排序的扩展)代码实现及详细注释
最新推荐文章于 2022-10-08 09:17:47 发布