/**
* 桶排序
*
*/
@Test
public void bucketSort(){
//获取0-1之间的随机生成的数组元素
float[] f=getRandomArray(10);
//桶排序
bucketSort(f);
System.out.println(Arrays.toString(f));
}
@SuppressWarnings("unchecked")
private void bucketSort(float[] f) {
int n=f.length;
//使用数组存储ArrayList,这个ArrayList就是我们的桶
ArrayList<Float>[] buckets=new ArrayList[n];
//初始化桶
for(int i=0;i<n;i++){
buckets[i]=new ArrayList<Float>();
}
//将桶元素分别规划到n组不同的桶里面
for(int i=0;i<n;i++){
int index=(int) Math.floor(n*f[i]);
buckets[index].add(f[i]);
}
//对于每个桶,如果元素数量大于1个,则需要对每个桶内部都进行排序,这里采取的是插入排序
for(int i=0;i<n;i++){
ArrayList<Float> bucket=buckets[i];
if(bucket.size()>1){
//插入排序
for(int m=1;m<bucket.size();m++){
for(int k=m;k>0&&bucket.get(k)<bucket.get(k-1);k--){
//交换元素
exchange(bucket, k, k-1);
}
}
//如果觉得使用上诉插入排序麻烦,可以考虑偷个懒,使用jdk自带的归并排序处理
// Collections.sort(bucket);
}
}
//将排序好的桶一一取出,存放到数组里面
int k=0;
for(int i=0;i<n;i++){
ArrayList<Float> bucket=buckets[i];
for(int j=0;j<bucket.size();j++){
f[k++]=bucket.get(j);
}
}
}
private void exchange(ArrayList<Float> bucket, int k, int j) {
float t=bucket.get(k);
bucket.set(k, bucket.get(j));
bucket.set(j, t);
}
private float[] getRandomArray(int size) {
float[] f=new float[size];
for(int i=0;i<size;i++){
f[i]=(float) Math.random();
}
return f;
}