桶排序(Bucket Sort)是计数排序的升级版。工作原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶里在分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。

算法描述:

1,找出数据空间,确定桶的个数。

2,遍历数组,将数据一个一个放到对应的桶里去。

3,对每个不是空的桶进行排序,可以使用其它排序方法,也可以递归使用桶排序。

4,从不是空的桶里把排好序的数据拼接起来。

动图演示:

代码实现:

import java.util.*;

public class Sort{
    public static void bucketSort(int[] arr){
        if(arr==null||arr.length==0){
           return;
        }
        //数组元素的个数
        int len=arr.length;
        //找出数组中的最大值和最小值
        int min=Integer.MAX_VALUE;
        int max=Integer.MIN_VALUE;
        for(int i:arr){
             if(min>i){
                 min=i;
             }
             if(max<i){
                 max=i;
             }
        }
        //计算桶的个数
        int n=(max-min)/len+1;
        List<ArrayList<Integer>> list=new ArrayList<>(n);
        for(int i=0;i<n;i++){
            list.add(new ArrayList());
        }
        //将数组元素填充到对应的桶里
        for(int i=0;i<len;i++){
            int num=(arr[i]-min)/len;
            list.get(num).add(arr[i]);
        }
        //对每个桶进行排序
        for(int i=0;i<n;i++){
            Collections.sort(list.get(i));
        }
        //排序之后输出
        for(ArrayList array:list){
            for(int i=0;i<array.size();i++){
                System.out.print(array.get(i)+" ");
            }
        }
    }

    public static void main(String[] args){
           int[] arr=new int[]{3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
           bucketSort(arr);           
    }
}

 

 posted on 2018-07-26 20:16  会飞的金鱼  阅读(195)  评论(0)    收藏  举报