• 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较大

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

  • 相关阅读:
    WZOI-255插队
    Android 底部导航栏(二、BottomNavigationView+自定义View+Fragment)
    QT6.3学习技巧,快速入门
    第05章_存储引擎
    【系统架构设计】计算机公共基础知识: 6 知识产权与标准化
    淘宝商品详情API接口(标题|主图|SKU|价格|商品销量)
    【Qt】顶层窗口和普通窗口区别以及用法
    如何保证测试用例的覆盖度?
    【算法|动态规划No.23】leetcode376. 摆动序列
    【C++】教大家在七夕new一个对象
  • 原文地址:https://blog.csdn.net/weixin_45825865/article/details/126105783