【数据结构与算法】桶排序

桶排序的思想是划分区间(桶),后一个区间中的数总是比前一个区间的大。例如按薪水排序,处于月薪数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++;
                }
            }
        }
    }

桶排序的时空复杂度与映射算法和桶内排序算法的选择有关。若映射算法选取不当,许多桶没有元素会造成空间浪费,或者桶内元素过多需要桶内排序从而增加时间复杂度,
最理的情况是每个桶只有一个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值