桶排序的思想是划分区间(桶),后一个区间中的数总是比前一个区间的大。例如按薪水排序,处于月薪数W元区间的任何一个人的薪水肯定比处于月薪数K元区间的所有人多。
分好桶后,再选择某一种算法对这个桶内的元素排序。最后根据桶的优先级依次取出元素,这样整个序列就有序了。
例如将浮点数数组{3.1,0.2,6.7,11.3,7.8,9.5,13.4}进行桶排序。每3.0划分为一个桶,共有五个桶。
public static int mapping(double d){
return (int)Math.floor(d/3.0);
}
public static void bucketSort(double[] data){
/*
* 将0.0到14.9平分成5个区间。第一个区间范围 为[0.0,3.0),第二个区间范围为[3.0,6.0)。
*/
ArrayList<Double>[] buckets=new ArrayList[5];
for(int i=0;i<data.length;i++){
int index=mapping(data[i]);
if(buckets[index]==null) buckets[index]=new ArrayList<Double>();
buckets[index].add(data[i]);
}
for(int i=0;i<5;i++){
if(buckets[i]!=null) Collections.sort(buckets[i]);
}
int count=0;
for(int i=0;i<5;i++){
if(buckets[i]!=null){
Iterator it=buckets[i].iterator();
while(it.hasNext()){
data[count]=(Double)it.next();
count++;
}
}
}
}
桶排序的时空复杂度与映射算法和桶内排序算法的选择有关。若映射算法选取不当,许多桶没有元素会造成空间浪费,或者桶内元素过多需要桶内排序从而增加时间复杂度,
最理的情况是每个桶只有一个元素。