数据结构与算法之基数算法

基数算法的思路是数组中的元素无论是几位数,但是每一位都不可能超过0-9的范围,所以通过循环判断每一位属于0-9的哪一个.将其放入对应的栈中,一次循环下来,确定了个位数的排序.如果是两个元素在同一个栈中那取出的顺序是先进先出.第二次循环确定十位的位置

第三次是百位以此类推.这里需要注意的是最大的循环次数应该是数组中最大元素的位数,所以如果发现位数不相同需要补0

    public static void jishu(int[] arr) {
        //将数组转换成字符串数组,并找到最长的数
        String[] sarr = new String[arr.length];
        int max = 1;
        for (int i = 0; i < arr.length; i++) {
            String s = String.valueOf(arr[i]);
            sarr[i] = s;
            if (s.length() > max) {
                max = s.length();
            }
        }

        for (int i = 0; i < sarr.length; i++) {
            int c = max - sarr[i].length();
            for (int x = 0; x < c; x++) {
                sarr[i] = "0" + sarr[i];
            }
        }

        Queue<String> queue0 = new ArrayDeque<>();
        Queue<String> queue1 = new ArrayDeque<>();
        Queue<String> queue2 = new ArrayDeque<>();
        Queue<String> queue3 = new ArrayDeque<>();
        Queue<String> queue4 = new ArrayDeque<>();
        Queue<String> queue5 = new ArrayDeque<>();
        Queue<String> queue6 = new ArrayDeque<>();
        Queue<String> queue7 = new ArrayDeque<>();
        Queue<String> queue8 = new ArrayDeque<>();
        Queue<String> queue9 = new ArrayDeque<>();

        for (int i = max - 1; i >= 0; i--) {
            for (int x = 0; x < sarr.length; x++) {
                String s = sarr[x].charAt(i) + "";
                switch (s) {
                    case "0":
                        queue0.add(sarr[x]);
                        break;
                    case "1":
                        queue1.add(sarr[x]);
                        break;
                    case "2":
                        queue2.add(sarr[x]);
                        break;
                    case "3":
                        queue3.add(sarr[x]);
                        break;
                    case "4":
                        queue4.add(sarr[x]);
                        break;
                    case "5":
                        queue5.add(sarr[x]);
                        break;
                    case "6":
                        queue6.add(sarr[x]);
                        break;
                    case "7":
                        queue7.add(sarr[x]);
                        break;
                    case "8":
                        queue8.add(sarr[x]);
                        break;
                    case "9":
                        queue9.add(sarr[x]);
                        break;
                }
            }
            int index = 0;
            while (!queue0.isEmpty()) {
                sarr[index] = queue0.poll();
                index++;
            }
            while (!queue1.isEmpty()) {
                sarr[index] = queue1.poll();
                index++;
            }
            while (!queue2.isEmpty()) {
                sarr[index] = queue2.poll();
                index++;
            }
            while (!queue3.isEmpty()) {
                sarr[index] = queue3.poll();
                index++;
            }
            while (!queue4.isEmpty()) {
                sarr[index] = queue4.poll();
                index++;
            }
            while (!queue5.isEmpty()) {
                sarr[index] = queue5.poll();
                index++;
            }
            while (!queue6.isEmpty()) {
                sarr[index] = queue6.poll();
                index++;
            }
            while (!queue7.isEmpty()) {
                sarr[index] = queue7.poll();
                index++;
            }
            while (!queue8.isEmpty()) {
                sarr[index] = queue8.poll();
                index++;
            }
            while (!queue9.isEmpty()) {
                sarr[index] = queue9.poll();
                index++;
            }
        }

        for (int i = 0; i < sarr.length; i++) {
            arr[i] = Integer.valueOf(sarr[i]);
        }
    }

 

 

以下是一个测试方法

public static void main(String[] args) {
        Random random = new Random();
        while (true) {
            int length = random.nextInt(100);
            int[] arr = new int[length];
            int[] arr2 = new int[length];
            for (int x = 0; x < length; x++) {
                int i = random.nextInt(10000);
                arr[x] = i;
                arr2[x] = i;
            }
            System.out.println(Arrays.toString(arr));
            jishu(arr);
            Arrays.sort(arr2);
            boolean equals = Arrays.equals(arr2, arr);
            System.out.println(equals);
            if (!equals) {
                break;
            }
        }
    }

 

posted @ 2022-04-23 22:59  顶风少年  阅读(191)  评论(0编辑  收藏  举报
返回顶部