计数排序和桶排序

目录

 

一、计数排序

​​二、桶排序


一、计数排序

假设4,3,2,2,6,7

1.一次遍历找到max=7,min=2;

2.计算要创建的桶大小为:max-min+1,并创建桶;

3.第二次遍历,将值存进通中,每个下标对应2~7的第几位,值为这个位出现的次数;

4.从头到尾输出,如果次数=0,不输出。为1,输出一次。>1,输出多次。

public List<Integer> countOrder(int [] arr){
        ArrayList<Integer> res = new ArrayList<>();
        if (arr.length==0||arr==null)return res;
        int min = Integer.MAX_VALUE;
        int max = Integer.MIN_VALUE;
        //1.一次遍历查找最大和最小值
        for (int i=0;i<arr.length;i++){
            min = Math.min(arr[i],min);
            max = Math.max(arr[i],max);
        }
        //2.新建大小为len的桶数组
        int len = max-min+1;
        int [] bucket = new int[len];
        //3.第二次遍历,将值存进桶中
        //注:桶的下标包包含了元素值,内容包含元素个数
        for (int i=0;i<arr.length;i++){
            bucket[arr[i]-min]++;
        }
        //4.最后将桶中元素按顺序输出
        for (int i=0;i<bucket.length;i++){
            for (int count = bucket[i];count>0;count--){
                res.add(i+min);
            }
        }
        return res;
    }

?mid=&wid=51824&sid=&tid=8555&rid=LOADED&custom1=mp.csdn.net&custom2=%2Fpostedit&t=1568791644177?mid=&wid=51824&sid=&tid=8555&rid=FINISHED&custom1=mp.csdn.net&t=1568791644177二、桶排序

假设:4,5,2,3,17,22

1.计算max=22 , min=2

2.桶数=(max-min)/len + 1 = 3;

    ->每个桶能容纳的个数=len=7;

3.将数组中元素存入桶

    ->当前元素应存入第(val-min)/len个桶中

4.对每个桶进行排序

5.按照顺序拼接和输出

public  List<Integer> bucketSort(int[] arr){
        ArrayList<Integer> res = new ArrayList<>();
        if (arr.length==0||arr==null)return res;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for(int i = 0; i < arr.length; i++){
            max = Math.max(max, arr[i]);
            min = Math.min(min, arr[i]);
        }

        //桶数
        int bucketNum = (max - min) / arr.length + 1;
        ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketNum);
        for(int i = 0; i < bucketNum; i++){
            bucketArr.add(new ArrayList<Integer>());
        }

        //将每个元素放入桶
        for(int i = 0; i < arr.length; i++){
            int num = (arr[i] - min) / (arr.length);
            bucketArr.get(num).add(arr[i]);
        }

        //对每个桶进行排序
        for(int i = 0; i < bucketArr.size(); i++){
            Collections.sort(bucketArr.get(i));
            //添加到结果
            for (int a:bucketArr.get(i)){
                res.add(a);
            }
        }
        return res;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMUHERO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值