桶排序(基数版)

一个十进制数,每一位都是由0-9之间的数组成,生成10个桶,从个位数开始比较到最大位数,建立一个辅助数组,利用先进先出的原则出桶放在辅助数组(和原数组一样大)中,直到比较最大位数的出桶结束。

例子:013,021,011,052,062,100

第一趟进桶(个位数):0号桶 100  1号桶 021 011 2号桶 052 062  3号桶 013

第一趟辅助数组(从0号桶开始出桶,先进先出):100 021 011 052 062 013

第二趟进桶(十位数):0号桶 100  1号桶 011 013  2号桶 021 5号桶 052 6号桶062

第二趟数组:100 011 013 021 052 062

第三趟进桶(百位数): 0号桶 011 013 021 052 062  1号桶 100

第三趟数组:011 013 021 052 062 100

名词解释:累加词频表:每个词频上的值相当于小于等于这个词频的数。

例:5 个 0,2个1,那么0的词频表的值是5, 1的词频表的值是7,相当于小于等于的值有7个,有了词频表,利用先进先出的原则,词频表的值-1就是最后一个进入桶的数要放入辅助数组中的索引。

代码如下

public void sort(int[] arr,int digit){ //桶排序
    int j = 0;  //某一位的值
    final int radix = 10;  //准备10个桶
    int[] help = new int[arr.length];  //辅助空间
    for (int d = 1; d <=digit; d++) {  //进桶出桶的次数
        int[] count = new int[radix]; //词频数组
        for (int i = 0; i < arr.length; i++) {  //统计词频
            j = getDigit(arr[i],d);
            count[j]++;
        }

        for (int i = 1; i < count.length; i++) {  //把词频表变成累加词频表
            count[i] = count[i]+count[i-1];
        }

        for (int i = arr.length-1; i >= 0; i--) {  //出桶的操作
            j = getDigit(arr[i],d);    //获得指定位数的值
            //最后入桶的,对应词频表的长度-1当成辅助空间的索引
            help[count[j]-1] = arr[i];
            count[j]--; //对应词频表-1
        }

        for (int i = 0; i < arr.length; i++) {  //复制到原数组
            arr[i] = help[i];
        }
    }
}

public int getDigit(int x,int d){  //获得某一位的位数
    return (int)(x/Math.pow(10,d-1))%10;
}

public int maxBits(int[] arr){  //获得数组中的最大值
    int max = arr[0];
    for (int i : arr) {
        max = Math.max(i,max);
    }
    int count = 0;
    while (max != 0){
        max /= 10;
        count++;
    }
    return count;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值