1 算法原理
假定我现在有一个[8,5,5,3,2]的数组a,让其递增排序,桶排序的思想是利用一个每个元素都为0的一个长度超过(该数组最大值+1)的数组,如[0,0,0,0,0,0,0,0,0]数组bucket,然后遍历数组a,对bucket[i]的元素加1,这样就将a数组的值出现的次数记录在bucket下标为该值得元素中了,例如a中5出现了两次,即bucket[5]的值为2,然后遍历从小到大遍历bucket的元素,过滤掉值为0的元素,就可以得到排序后的数组了。类似把数组的值丢到依次排列的桶子里面,把空桶子丢掉,然后在依次记录剩余的桶子下标,就得到了排序后的顺序。
2 JAVA源码实现
// Sort.java
public class Sort {
public static void BucketSortBase(int []intArray) {
int size = intArray.length;
int []bucket = new int[max(intArray)+1]; //初始化一个长度等于size+1的数组
for(int i=0;i<bucket.length;i++) {//将每个值赋0
bucket[i]=0;
}
for(int e:intArray) {//把待排序的元素丢到对应的桶子里面
bucket[e]++;
}
int []result = new int[size];//new一个用于装排序后的数组
int j = 0;
for(int i=0;i<bucket.length;i++) {//过滤掉空桶
if(bucket[i]!=0) {
for (int k=0;k<bucket[i];k++) {//处理重复值
result[j++] = i;
}
}
}
for(int e:result) {
System.out.println(e);//打印结果
}
}
public static int max(int []intArray) {
int max = intArray[0];
for(int i=1;i<intArray.length;i++) {
if(max<intArray[i]) {
max = intArray[i];
}
}
return max;
}
}
//Test.java
public class Test {
public static void main(String []args) {
int []a = {5,5,3,2,7};
Sort.BucketSortBase(a);
}
}
结果打印为:
2
3
5
5
8
3 降序
如果想使用降序,在过滤的时候从相反的方向把值放进result数组中即可。
4 总结
这是一个非常简单的桶排序实现方案,只能处理纯数组元素,如果想实现有键值对的集合排序,需要对算法进行升级改造,之后再撸。