前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【排序5】基数排序:数字的组织与整理艺术

【排序5】基数排序:数字的组织与整理艺术

作者头像
小舒不服输
发布2024-01-30 13:49:29
1100
发布2024-01-30 13:49:29
举报
文章被收录于专栏:编程乐园·编程乐园·
🎡基数排序

🎊1、基本思想

基数排序(Radix Sort)是一种非比较排序算法,它根据数字的每一位来对元素进行排序。它适用于排序整数固定长度的字符串。基数排序的主要思想是从最低位(个位)开始,依次对所有元素进行排序,然后再从次低位(十位)开始,以此类推,直到最高位(或最长的字符串长度)排序完成。

🎊2、基本步骤

1、获取待排序的整数列表。 2、初始化一个临时数组,用于存储每个位数的数字出现的次数。 3、从最低位开始,依次遍历待排序的整数列表中的每个数字,统计每个位数的数字出现的次数。 4、将统计结果存储到临时数组中。 5、根据临时数组中的统计结果,依次将待排序的整数列表中的数字移动到正确的位置。 6、重复步骤3-5,直到最高位遍历完毕。

如图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🎊3、代码示例

代码语言:javascript
复制
public class RadixSort implements IArraySort {

    @Override
    public int[] sort(int[] sourceArray) throws Exception {
        // 对 arr 进行拷贝,不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        int maxDigit = getMaxDigit(arr);
        return radixSort(arr, maxDigit);
    }

    /**
     * 获取最高位数
     */
    private int getMaxDigit(int[] arr) {
        int maxValue = getMaxValue(arr);
        return getNumLenght(maxValue);
    }

    private int getMaxValue(int[] arr) {
        int maxValue = arr[0];
        for (int value : arr) {
            if (maxValue < value) {
                maxValue = value;
            }
        }
        return maxValue;
    }

    protected int getNumLenght(long num) {
        if (num == 0) {
            return 1;
        }
        int lenght = 0;
        for (long temp = num; temp != 0; temp /= 10) {
            lenght++;
        }
        return lenght;
    }

    private int[] radixSort(int[] arr, int maxDigit) {
        int mod = 10;
        int dev = 1;

        for (int i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
            // 考虑负数的情况,这里扩展一倍队列数,其中 [0-9]对应负数,[10-19]对应正数 (bucket + 10)
            int[][] counter = new int[mod * 2][0];

            for (int j = 0; j < arr.length; j++) {
                int bucket = ((arr[j] % mod) / dev) + mod;
                counter[bucket] = arrayAppend(counter[bucket], arr[j]);
            }

            int pos = 0;
            for (int[] bucket : counter) {
                for (int value : bucket) {
                    arr[pos++] = value;
                }
            }
        }

        return arr;
    }

  ate int[] arrayAppend(int[] arr, int value) {
        arr = Arrays.copyOf(arr, arr.length + 1);
        arr[arr.length - 1] = value;
        return arr;
    }
}

🎊4、特性总结

空间效率:O(r) 时间效率:O(d(n+r)),它与序列的初始状态无关。 稳定性:稳定。

🎉OK!今天的分享就到这里了,后面还会分享更多算法,敬请关注喔!!!✌️

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🎡基数排序
  • 🎊1、基本思想
  • 🎊2、基本步骤
  • 🎊3、代码示例
  • 🎊4、特性总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档