• 8-9基数排序


    基于链表的基数排序
    一.过程
    在这里插入图片描述
    将每个元素拆为个位、十位、百位,每一位的取值可能是0-9

    建立十个队列。先处理个位(按最低位优先LSD),520的个位是0,放入Q0,211的个位是1,放入Q1
    在这里插入图片描述

    在这里插入图片描述
    同一个位的元素按照队列的规则从队尾进入
    在这里插入图片描述以此类推
    在这里插入图片描述
    按出队顺序,按递减次序排序,因此从Q9到Q0搜集元素
    得到438→888→168→007→666→996…
    至此完成了个位由大到小的排列

    同样,按照十位放入队列。十位为3的放到Q3,以此类推
    在这里插入图片描述
    在这里插入图片描述

    再按照出队顺序,从Q9到Q0搜集元素
    在这里插入图片描述
    再按百位元素放入队列,收集
    在这里插入图片描述

    在这里插入图片描述
    至此完成了排序
    可以看出
    1.百位的权重>十位的权重>个位的权重,每次都先处理权重最低的次序。
    2.对于n个待排序元素,每个关键字可以拆分成d元组(百位十位个位就是三元组),其中百位叫做最高位关键字(最主位关键字),个位叫做最低位关键字(最低次关键字)
    3.每一位的可能取值为0~9,即r=10,0~r-1,r称为基数

    二.效率分析
    1.空间复杂度,需要r个辅助队列,O( r)
    2.时间复杂度:被拆成3个部分,进行3趟的分配和收集。对于拆成d个部分,需要进行d趟分配和收集。每一趟的分配需扫描所有元素O(n),每一趟收集需要O( r) (对每个队列的收集只需要O(1))。因此总的时间复杂度为O(d(n+r))
    d趟分配和收集(个十百三位)
    n个元素
    每个部分r个可能取值(0-9)
    3.稳定性
    按照队列先进先出的原则,该算法是稳定
    在这里插入图片描述
    三.基数排序的应用
    对10000名学生的信息按年龄递减排序
    生日可拆分为三组关键字:年(1991-2005)、月(1-12)、日(1-31)
    显然,权重年>月>日
    其中,年月日越小,年龄越大,所以每次收集都是从左至右
    在这里插入图片描述
    在以下几种情况下可以优先选择基数排序
    数据元素的关键字可以方便的拆分为d组(个十百),d较小,关键字的取值范围r较小,数据元素个数n较大

    四.总结
    在这里插入图片描述

  • 相关阅读:
    记一次mongo查询时间从大于30多秒优化到100ms的过程
    Mac上好用的翻译软件推荐 兼容m
    AI数据分析:根据Excel表格数据进行时间序列分析
    【第2章 Node.js基础】2.7 Node.js 的流(一) 可读流
    Java面试指南
    服务器资源监控工具Nmon工具搭建教程
    【从零开始游戏开发】Unity 前后端网络通信该如何搭建?注释解答 | 全面总结 |建议收藏
    自动化测试和性能测试的区别
    C#开源且免费的Windows桌面快速预览神器 - QuickLook
    09循环嵌套
  • 原文地址:https://blog.csdn.net/weixin_45825865/article/details/126105783