简单桶式排序
有限个数字m,每个数字的大小都在1与n之间,则我们可以假设有n个桶,遍历m个数字,将其存入对应的桶中(如数字的值为3,就存入3号桶,桶的值对应存入数字的个数
桶号 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
计数 | 1 | 1 | 2 | 0 | 1 |
我们按照桶的序号将数字倒出来,如下:
桶的倒出顺序 | 数字队列 |
---|---|
5号桶倒出1个5 | 5 |
4号桶倒出0个4 | 5 |
3号桶倒出2个3 | 5,3,3 |
2号桶倒出1个2 | 5,3,3,2 |
1号桶倒出1个1 | 5,3,3,2,1 |
/**
* 桶式排序
* @author yangpeng
*
*/
public class BucketSortDemo {
public static void main(String[] args) {
int[] a = { 9, 4, 7, 2, 5, 8, 3, 2, 10, 1 };
System.out.println("初始序列:" + Arrays.toString(a));
bucketSort(a,10);
}
/**
*
* @param a 需要排序的数组
* @param max 数组中的最大值
*/
public static void bucketSort(int[] a,int max){
int[] count=new int[max+1];//创建一个长度为max的数组
// 遍历数组a
for (int i = 0; i < a.length; i++) {
// 如果数组a的值 作为的count的 下标,每次出现一次 count数组的值+1
count[a[i]]++;
}
// 将桶的中数字倒出
System.out.print("排序好的序列:");
for (int i = 0; i < count.length; i++) {
while(count[i]>0){
System.out.print(i +" ");
count[i]--;
}
}
}
}
弊端
如果我们的数字波动范围非常大,比如1到10000,那么我们需要一个10000元素数组的空间开销,而且在倒出数字的时候需要遍历10000个桶,这样效率是非常低的