基数排序算法

跟着注释不迷路:

public class BaseSort {
    public static int[] basicSort(int[] array) {
        //1、取出最大元素max
        int max = 0;
        for (int k : array) {
            if (k > max) {
                max = k;
            }
        }

        //2、(max为int类型)计算max的位数times
        int times = 0;
        while (max > 0) {
            max = max / 10;
            times++;
        }

        //3、构造一个List结构,用于按一定规则存放元素
        List<List<Integer>> queen = new LinkedList<>();
        for (int i = 0; i < 10; i++) {
            //添加10个空的list元素用来存元素(数字0~9是10个数,对应数字的每位上的所有可能值)
            List<Integer> q = new LinkedList<>();
            queen.add(q);
        }

        //4、指定存放规则:依次按个、十、百。。。位的值num存放在queen的第num个位置
        //max是几位数就循环几次
        for (int i = 0; i < times; i++) {
            for (int k : array) {
                //Math.pow(10, i)是10的i次方
                //x为queen的索引,依次按个、十、百。。。max确定元素在queen上的位置
                int x = k % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
                List<Integer> q = queen.get(x);
                q.add(k);
            }
            //以上循环结束后每个元素在queen上的第几个位置就确定了

            //5、暂存以上排序结果:
            // 从queen上按序取出每个位置上list中的值放到数组中,这样数组就有序了
            int count = 0;
            for (int j = 0; j < 10; j++) {
                //不遍历空list
                while (!queen.get(j).isEmpty()) {
                    //将queen上的元素按序移动到数组中以保存queen上元素顺序并清空queen
                    List<Integer> c = queen.get(j);
                    array[count] = c.get(0);
                    c.remove(0);
                    count++;
                }
            }
        }
        return array;
    }
}

测试类:

public class TestSort {
    int[] array = {8, 31, 36, 177, 132, 5, 21, 14};

    @Test
    public void baseSort() {
        int[] sort = BaseSort.basicSort(array);
        for (int i : sort) {
            System.out.println(i);
        }
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值