原理:
分别从 个、十、百 ... 开始排序,第一次比较个位上的大小,第二次比较十位,以此类推。
其中比较的最大位数,即为数组中元素的最大位数(且不能为比较负数,如果比较负数需要在比较之前变成绝对值,在加负号)
步骤:
1.先创建二维数组存放10个桶
2.在创建一维数组存放每个桶存放元素的数量
3.遍历每个桶顺序取出元素
public int[] bucketSort(int[] arr){
//计算出最大的位数
int maxLength = arr[0];
for(int i=1;i<arr.length;i++){
if(maxLength<arr[i]){
maxLength=arr[i];
}
}
//获得最大位数
maxLength = (maxLength+"").length();
//定义二维数组,存放10个桶
int[][] buckets = new int[10][arr.length];
//定义一维数组记录每个桶的元素下标位置
int[] bucketsIndex = new int[10];
//从个位开始遍历 个 -> 十 -> 百 -> 千
for(int i=0,n=1;i<maxLength;i++,n*=10){
//存数据
for(int j=0;j<arr.length;j++){
//获取要存的桶
int bIndex = arr[j]/n%10;
//存数据
buckets[bIndex][bucketsIndex[bIndex]++] = arr[j];
}
//取数据
//定义数组的下标
int index = 0;
for(int j=0;j<bucketsIndex.length;j++){
//判断桶是否为空
if(bucketsIndex[j]!=0){
//遍历取数据
for(int x = 0;x<bucketsIndex[j];x++){
arr[index++] = buckets[j][x];
}
}
bucketsIndex[j] =0;
}
}
return arr;
}