桶排序
因为一个十进制数,个位或者十位或者百位或者…上的可能取值有十种情况,分别是0~9,所以有10个桶,每个桶里面之所有分8层,是因为上面的例子有8个数需要排序
第一轮后:
第一轮是根据个位数的值放入桶的。然后再按从左到右,从上到下的顺序把桶里的值依次赋值到原数组中,得:210,100,200,10,23,326,8,99
第二轮:
第三轮:
至此已经排序完毕
public static void Bucketsort(int[] arr){
//十进制即十个桶
int[][] bucket = new int[10][arr.length];
//十个指针,用来记录每个桶当前装了多少个数字
int[] bucketPointer = new int[10];
//需要找出原数组值最大的数
int max = arr[0];
for (int i=0;i<arr.length;i++){
if (arr[i]>max){
max=arr[i];
}
}
//获取最大值的位数
int maxlenth = (max+"").length();
//3、依次循环maxlenth次,
for (int i=0,n=1;i<maxlenth;i++,n*=10){
// 把数组中的值,根据个位数或者十位数或者百位数....放入桶中
for (int j=0;j<arr.length;j++){
int digital = arr[j] / n %10; //digital用来记录当前数的个位数、十位数...的值
bucket[digital][bucketPointer[digital]]=arr[j];//根据值不同,放入到不同的桶中
bucketPointer[digital]++;//记录每个桶当前装有几个数
}
int index = 0;
//放完之后, 遍历每个桶并且把桶中的数据依次放入到原数组里
for (int k=0;k<bucketPointer.length;k++){
//只要桶里有数据
if (bucketPointer[k]!=0){
for (int l = 0;l<bucketPointer[k];l++){
arr[index]=bucket[k][l];
index++;
}
}
//每一轮后记得把指针的值清空
bucketPointer[k]=0;
}
}
}