一个有问题的基数排序(求解)

2 篇文章 0 订阅
1 篇文章 0 订阅

 

当要排序的数字量较大时(1000+),随机数的范围比较小(1-100),排序后的数组会出现个别数字排序错误,

 

 

public class 基数排序 {

    public static void main(String[] args) {
        int[] e = new int[1000];
        for(int i = 0; i<e.length; i++) {
            e[i] = (int) (Math.random() * 100);
        }
        int[] sort = sort(e, 1, 1000);
        for (int i = 0; i < sort.length-1; i++) {
            if(sort[i]>sort[i+1]) {
                System.out.println(sort[i]);
            }
        }
    }
    
    /**
     * 排序
     * @param e    数组
     * @param a    个位数开始排序,(第一次传入为1)-->10-->100
     * @param max    数组中最大数(不知道就往大填)
     * @return    排序好的数组
     */
    public static int[] sort(int[] e, int a, int max) {
        int[][] bucket = new int[10][e.length];
        for(int i=0; i<e.length; i++) {
            int j = 0;
            while (bucket[(e[i])%(a*10)/a][j]!=0) {        //取个位数-->十位数-->百位数
                j++;
            }
            bucket[(e[i])%(a*10)/a][j] = e[i];
        }
        
        int x = 0;
        for(int i=0; i<10; i++) {
            int j = 0;
            while (bucket[i][j]!=0) {
                e[x] = bucket[i][j];
                x++;
                j++;
                if(j>=e.length) {        //当要排序的数组都去了二维数组中的某个数组,直接返回
                    return e;
                }
            }
        }
        if(a*10 < max) {                //当排序位数小于数组最大数,继续排
            return sort(e, a*10, max);
        }
        return e;
        
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值