• 【算法】基数排序算法的讲解和代码演示


    思路

    基数排序也是三个桶排序算法之一,排序过程也是不需要进行比较。
    基数排序的主要思路是:
    1、先按个位数不同,把数组中所有元素放到0~9这10个不同的桶中;
    2、从桶中按先入先出的顺序取出数据,此时数组个位数已经有序,再按照十位,放入桶中;
    3、再取出,直到所有位数到进过桶,就完成了整个数组的排序。
    另外说明一下计数排序的适用场景:
    1、因为是按位数进行排序的,所以只能排正整数;
    2、数组中的元素间隔越小越好。比如如果有一个数组是[1, 2, 111111111],这样虽然只有一个数有9位,但是所有数都要跟着入桶。

    讲解

    有数组如下:
    在这里插入图片描述
    我们先按各位给所有数字入桶,入桶后如下:
    在这里插入图片描述
    第一次按个位数入桶后,从桶中把数取出得到如下数组:
    在这里插入图片描述
    然后按照十位数进行第二次入桶:
    在这里插入图片描述
    再次取出,得到数组如下:
    在这里插入图片描述
    下面进行百位数的最后一次入桶操作:
    在这里插入图片描述
    最后取出,排序完成:
    在这里插入图片描述

    实现

        @Test
        public void sortTest() {
            int[] nums = new int[]{2, 0, 31, 248, 243, 36, 46, 55};
            radixSort(nums);
            System.out.println(Arrays.toString(nums));
        }
    
        private void radixSort(int[] nums) {
            if (nums.length < 2) {
                return;
            }
            // 找到最大值,确定需要入几次桶
            int maxValue = Integer.MIN_VALUE;
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] > maxValue) {
                    maxValue = nums[i];
                }
            }
            // 遍历入桶和取出,次数为最大数的位数
            for (int i = 0, divideNum = 10; i < String.valueOf(maxValue).length(); i++, divideNum *= 10) {
                // 初始化10个桶
                int[][] bucketArray = new int[10][0];
                // 遍历数组元素,按当前的数位入桶
                for (int j = 0; j < nums.length; j++) {
                    int remainder = nums[j] % divideNum;
                    if (divideNum > 10) {
                        remainder = remainder / (divideNum / 10);
                    }
                    bucketArray[remainder] = arrayAppend(bucketArray[remainder], nums[j]);
                }
                // 从桶中取出数据并放回数组
                for (int j = 0, l = 0; j < 10; j++) {
                    for (int k = 0; k < bucketArray[j].length; k++) {
                        nums[l++] = bucketArray[j][k];
                    }
                }
            }
        }
    
        private int[] arrayAppend(int[] array, int num) {
            int[] ints = Arrays.copyOf(array, array.length + 1);
            ints[ints.length - 1] = num;
            return ints;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    看下运行结果:
    在这里插入图片描述


    喜欢本文的朋友不要忘记点一个免费的赞哦,你的赞将是我最大的动力。

  • 相关阅读:
    python virtualenv创建虚拟环境
    VSCode提交本地文件到Github远程仓库详细教程
    【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 3
    Ubuntu磁盘满了,导致黑屏
    Kibana从已有的ES连接转到新的ES连接的简要步骤
    「设计模式」六大原则之五:依赖倒置原则小结
    关于HTTP模块访问之后响应网页
    YOLO目标检测——树叶检测数据集下载分享【含对应voc、coco和yolo三种格式标签】
    Hive的分区和分桶
    動態PPTP代理IP是什麼?
  • 原文地址:https://blog.csdn.net/qq_34972627/article/details/125501212