基数排序(只适合整数)

基数排序图例

通常比较大小,我们直接就找到最大的位数的数。假设所有的数的位数都相同,根据对10的幂去模,从而保存进不同的集合;随着10的次幂的不断增大,数组排序完成了。

    /**
     *基数排序:
     *核心思想: 
     *   1.首先获取最大的绝对值的数
     *   2.求出最大的绝对值的数,是10的times次幂。
     *   3.建立19个集合,分别保存个位是(-9,-8,-7,……,1,2,3,……8,9)的数
     *   4. 根据times次幂建立外层循环for(int i=0;;)
     *      a. 获取对应的位的值  
     *      b. 把每个数添加进相应的集合
     *   5.收集数据
     * @param array
     */
    public void basicSort(int [] array) {
        if(array == null && array.length ==0) {
            return ;
        }
        int max =0;
        //1获取最大的绝对值的数
        for(int i =0;i<array.length;i++) {
            if(Math.abs(max)<Math.abs(array[i])) {
                max = array[i];
            }
        }
        int times = 0;
        if(max<0) max = -max;
        //2求出最大的绝对值的数,是10的times次幂。
        while(max >0) {
            max = max/10;
            times ++;
        }
        List<ArrayList> queue = new ArrayList<ArrayList>();
        //3建立19集合,分别保存个位是(-9,-8,-7,……,1,2,3,……8,9)的数
        for(int i =0;i<20;i++) {
            ArrayList q = new ArrayList();
            queue.add(q);
        }
        //4根据位数循环
        for(int i =0 ;i<times;i++) {
            //把每个数添加进相应的集合
            for(int j =0; j<array.length;j++) {
                //4.1获取对应的位的值
                int x = array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i);
                ArrayList q = queue.get(10+x);
                //4.2把每个数添加进相应的集合
                q.add(array[j]);
                queue.set(10+x, q);
            }
            //5开始收集
            int count=0;
            for(int j =0;j<20;j++) {
                while(queue.get(j).size()>0) {
                    ArrayList<Integer> q = queue.get(j);
                    array[count] = q.get(0);
                    q.remove(0);
                    count++;
                }
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值