优化嘛,直接上代码,然后解释代码
public static int[] bucketSort(int[] arr,int sumWei){
//每一位循环一次
for (int i = 0; i < sumWei; i++) {
//count数组代表到达某一位之前有多少个小于这个数的值
int[] count=new int[10];
for (int j = 0; j < arr.length; j++) {
count[getWei(arr[j],i)]++;
}
for (int j = 1; j < count.length; j++) {
count[j]=count[j]+count[j-1];
}
//help数组保存一遍过后的出桶结果
int[] help=new int[arr.length];
for (int j = arr.length-1; j >=0 ; j--) {
int index=count[getWei(arr[j],i)]--;
help[index-1]=arr[j];
}
//将出桶结果替换给arr
for (int j = 0; j < help.length; j++) {
arr[j]=help[j];
}
}
return arr;
}
//获取某一位上的值
public static int getWei(int num,int wei){
if(wei==0){
return num%10;
}else {
return num/(wei*10)%10;
}
}
代码解释
public static int[] bucketSort(int[] arr,int sumWei){
传入的参数,arr是原数组,sumWei代码原数组中最大值是多少位的。
for (int i = 0; i < sumWei; i++) {
外层for循环,就是基数排序中,一共有多少二进制位,就入桶出桶多少次。
int[] count=new int[10];
for (int j = 0; j < arr.length; j++) {
count[getWei(arr[j],i)]++;
}
for (int j = 1; j < count.length; j++) {
count[j]=count[j]+count[j-1];
}
这部分代码,定义一个count数组,这个数组中保存的是某一位上的某个数,所有数中小于等于这个数的,一共有多少个。比如当i==0时,表示个位,count[2]=3,代表的是,原数组中,个位数小于等于2的,一共有3个。
//help数组保存一遍过后的出桶结果
int[] help=new int[arr.length];
for (int j = arr.length-1; j >=0 ; j--) {
int index=count[getWei(arr[j],i)]--;
help[index-1]=arr[j];
}
这部分的意思是,将原数组从后往前遍历,然后找到第i位的数,然后,在count数组中查找,比如,原数组最后一个数为52,此时i==0,表示个位数,52个位数是2,然后,查找count[2]=3,此时,就说明,52应该放在help数组中的help[3-1]也就是help[2]的位置,,然后count[2]–。
什么意思呢?count数组保存的是某一位上前面小于等于这个数总共有多少个,那么,原数组从后往前遍历的话,查出count中的值,不就是基数排序是,应该出桶的顺序吗?所以,直接放help中相应位置就好了。
相当于,我们用count来保存原来的某一位的顺序,然后利用这个顺序,将结果保存到help中,这不就是基础排序中,一次入桶出桶的结果吗?
//将出桶结果替换给arr
for (int j = 0; j < help.length; j++) {
arr[j]=help[j];
}
}
最后,将一次help的结果,就是一次入桶出桶的结果,放回arr中,然后,再次进入下一轮基数排序,从个位变成10位…,然后依次遍历。