排序算法--基数排序

10、基数排序(Radix Sort)

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

10.1 算法描述

  • 取得数组中的最大数,并取得位数;
  • arr为原始数组,从最低位开始取每个位组成radix数组;
  • 对radix进行计数排序(利用计数排序适用于小范围数的特点);

10.2 动图演示

图片说明

10.3 代码实现

import java.util.ArrayList;

/**
 * @author cai-xiansheng
 * @Description 基数排序
 * @create 2021-01-17 22:38
 */
public class RadixSort {

    /**
     * 都是:n*k (k桶的数量)
     * @param arr
     */
    public static void radixSort(int[] arr) {
        if (arr == null || arr.length < 2)
            return;
        int max = arr[0];
        for (int i = 1; i < arr.length; i++)
            max = Math.max(max, arr[i]);
        int maxDigit = 0;
        while (max != 0) {
            maxDigit++;
            max /= 10;
        }
        // mod、div用来计算当前位的值,mod用来取余,然后div用来做除法。(arr[i] % mod) / div
        int mod = 10, div = 1;
        ArrayList<ArrayList<Integer>> bucketList = new ArrayList<>();
        for (int i = 0; i < 10; i++)
            bucketList.add(new ArrayList<>());
        // 用来循环最大值的位数,从小到大
        for (int i = 0; i < maxDigit; i++, mod *= 10, div *= 10) {
            // 用来分别添加到桶当中。
            for (int j = 0; j < arr.length; j++) {
                // 计算哪个桶
                int num = (arr[j] % mod) / div;
                // 在对应的桶中添加元素
                bucketList.get(num).add(arr[j]);
            }
            int index = 0;
            // 这儿用来将桶里面的元素添加到数组中
            // 循环桶
            for (int j = 0; j < bucketList.size(); j++) {
                // 循环桶里面的
                for (int k = 0; k < bucketList.get(j).size(); k++)
                    arr[index++] = bucketList.get(j).get(k);
                bucketList.get(j).clear();
            }
        }
    }

}

10.4 算法分析

基数排序基于分别排序,分别收集,所以是稳定的。但基数排序的性能比桶排序要略差,每一次关键字的桶分配都需要O(n)的时间复杂度,而且分配之后得到新的关键字序列又需要O(n)的时间复杂度。假如待排数据可以分为d个关键字,则基数排序的时间复杂度将是O(d*2n) ,当然d要远远小于n,因此基本上还是线性级别的。

基数排序的空间复杂度为O(n+k),其中k为桶的数量。一般来说n>>k,因此额外空间需要大概n个左右。

全部评论

相关推荐

03-06 20:09
贵州大学 Java
King987:你这个学历找个中大厂刷实习经历都是可以的,但是项目要有亮点才行,这个什么外卖就不要做了,去找找最新的项目,至少涉及高并发或者是新型的AI技术mcp rag啥的 ,我在出简历点评,但是你这个没什么好点评的,内容太少,而且含金量太低。自己改一改吧,或者看一下我的项目地址中,那里有大厂最近做过的实习项目
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
5154次浏览 48人参与
# 你的实习产出是真实的还是包装的? #
1114次浏览 27人参与
# 米连集团26产品管培生项目 #
4208次浏览 198人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
6921次浏览 37人参与
# 简历第一个项目做什么 #
31257次浏览 313人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186369次浏览 1115人参与
# 巨人网络春招 #
11181次浏览 223人参与
# 研究所笔面经互助 #
118745次浏览 577人参与
# 面试紧张时你会有什么表现? #
30380次浏览 188人参与
# 简历中的项目经历要怎么写? #
309398次浏览 4154人参与
# AI时代,哪些岗位最容易被淘汰 #
62445次浏览 731人参与
# 网易游戏笔试 #
6324次浏览 83人参与
# 职能管理面试记录 #
10696次浏览 59人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
6862次浏览 154人参与
# 从哪些方向判断这个offer值不值得去? #
56698次浏览 357人参与
# 你怎么看待AI面试 #
179285次浏览 1165人参与
# 腾讯音乐求职进展汇总 #
160398次浏览 1105人参与
# 小红书求职进展汇总 #
226849次浏览 1356人参与
# 正在春招的你,也参与了去年秋招吗? #
362545次浏览 2631人参与
# 你的房租占工资的比例是多少? #
92125次浏览 896人参与
# 校招笔试 #
466463次浏览 2951人参与
# 机械求职避坑tips #
94398次浏览 567人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务