优化基数排序

优化嘛,直接上代码,然后解释代码

    public static int[] bucketSort(int[] arr,int sumWei){

        //每一位循环一次
        for (int i = 0; i < sumWei; i++) {
            //count数组代表到达某一位之前有多少个小于这个数的值
            int[] count=new int[10];
            for (int j = 0; j < arr.length; j++) {
                count[getWei(arr[j],i)]++;
            }
            for (int j = 1; j < count.length; j++) {
                count[j]=count[j]+count[j-1];
            }

            //help数组保存一遍过后的出桶结果
            int[] help=new int[arr.length];
            for (int j = arr.length-1; j >=0 ; j--) {
                int index=count[getWei(arr[j],i)]--;
                help[index-1]=arr[j];
            }
            //将出桶结果替换给arr
            for (int j = 0; j < help.length; j++) {
                arr[j]=help[j];
            }
        }
        return arr;
    }

	//获取某一位上的值
    public static int getWei(int num,int wei){
        if(wei==0){
            return num%10;
        }else {
            return num/(wei*10)%10;
        }
    }

代码解释

public static int[] bucketSort(int[] arr,int sumWei){

传入的参数,arr是原数组,sumWei代码原数组中最大值是多少位的。

for (int i = 0; i < sumWei; i++) {

外层for循环,就是基数排序中,一共有多少二进制位,就入桶出桶多少次。

 int[] count=new int[10];
            for (int j = 0; j < arr.length; j++) {
                count[getWei(arr[j],i)]++;
            }
            for (int j = 1; j < count.length; j++) {
                count[j]=count[j]+count[j-1];
            }

这部分代码,定义一个count数组,这个数组中保存的是某一位上的某个数,所有数中小于等于这个数的,一共有多少个。比如当i==0时,表示个位,count[2]=3,代表的是,原数组中,个位数小于等于2的,一共有3个。

 //help数组保存一遍过后的出桶结果
            int[] help=new int[arr.length];
            for (int j = arr.length-1; j >=0 ; j--) {
                int index=count[getWei(arr[j],i)]--;
                help[index-1]=arr[j];
            }

这部分的意思是,将原数组从后往前遍历,然后找到第i位的数,然后,在count数组中查找,比如,原数组最后一个数为52,此时i==0,表示个位数,52个位数是2,然后,查找count[2]=3,此时,就说明,52应该放在help数组中的help[3-1]也就是help[2]的位置,,然后count[2]–。
什么意思呢?count数组保存的是某一位上前面小于等于这个数总共有多少个,那么,原数组从后往前遍历的话,查出count中的值,不就是基数排序是,应该出桶的顺序吗?所以,直接放help中相应位置就好了。
相当于,我们用count来保存原来的某一位的顺序,然后利用这个顺序,将结果保存到help中,这不就是基础排序中,一次入桶出桶的结果吗?

            //将出桶结果替换给arr
            for (int j = 0; j < help.length; j++) {
                arr[j]=help[j];
            }
        }

最后,将一次help的结果,就是一次入桶出桶的结果,放回arr中,然后,再次进入下一轮基数排序,从个位变成10位…,然后依次遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值