算法与数据结构——基数排序

news/2024/11/5 17:12:13/文章来源:https://www.cnblogs.com/1873cy/p/18515733

基数排序

基数排序(radix sort)的核心思想与计数排序一致,也通过统计个数来实现排序。计数排序适用于数据量n较大但数据范围m比较小的情况。假设我们需要对n=106个学号进行排序,而学号是一个8位数字,这意味着数据范围m=108非常大,使用计数排序需要分配大量内存空间,而基数排序可以避免这种情况。

基数排序在计数排序的基础上,利用数字各位之间的递进关系,依次对每一位进行排序,从而得到最终的排序结果。

算法流程

以学号数据为例,假设数字的最低位是第1位,最高位是第8位。算法流程如下:

  1. 初始化位数k = 1。
  2. 对学号的第k位执行“计数排序”。完成后,数据根据第k位从小到大排序。
  3. 将k增加1, 然后返回步骤2.继续迭代,直到所有位都排序完成后结束。

下面剖析代码实现。对于一个d进制的数字x,哟啊获取其第k位xk,可以使用以下计算公式:

其中 ⌊a⌋ 表示对浮点数a向下取整,而 mod d表示对d取模(取余)。对于学号数据,d=10且k ∈ [1, 8]。

此外,我们需要小幅度改动计数排序代码,是之可以根据数字的第k位进行排序:

/* 获取元素num的第k位 其中 exp = 10^(k - 1) */
int digit(int num, int exp){// 传入exp而非k 可以避免在此重复执行昂贵的次方运算return (num / exp) % 10;
}
/* 计数排序(根据num的第k位进行排序) */
void countingSortDigit(vector<int> &nums, int exp){// 10进制的位范围是0~9,因此需要长度为10的桶数组vector<int> counter(10, 0);int n = nums.size();// 统计0~9各数字的出现次数for (int i = 0; i < n; ++i){int d = digit(nums[i], exp);		// 获取nums[i]的第k位,记为dcounter[d]++;						// 统计数字d的出现次数}// 求前缀和,将“出现个数”转换为“数组索引”for (int i = 1; i < 10; ++i){counter[i] += counter[i - 1];}// 倒序遍历,根据桶内统计结果,将各元素填入resvector<int> res(n, 0);for (int i = n - 1; i >= 0; --i){int d = digit(nums[i], exp);int j = counter[d] - 1;		// 获取d在数组中的索引 jres[j] = nums[i];					// 将当前元素填入索引 jcounter[d]--;						// 将d的数量减1}// 使用结果覆盖原数组for (int i = 0; i < n; ++i){nums[i] = res[i];}
}
/* 基数排序 */
void radixSort(vector<int> &nums){// 获取数组最大元素,用于判断最大位数int m = *max_element(nums.begin(), nums.end());// 按照从低位到高位的顺序遍历for (int exp = 1; exp < m; exp *= 10){countingSortDigit(nums, exp);}
}

为什么从最低位开始排序?
在连续的排序轮次中,后一轮排序会覆盖前一轮排序的结果。举例来说,如果第一轮排序结果a < b,而第二轮排序结果a > b,那么第二轮的结果将取代第一轮的结果。由于数字的高位优先级高于低位,因此应该先排序低位再排序高位。

算法特性

相较于计数排序,基数排序适用于数值范围比较大的情况,但前提是数字必须是可以表示为固定位数的格式,且位数不能过大。例如,浮点数不适合使用基数排序,因为其位数k过大,可能导致时间复杂度O(nk)≫O(n2)。

  • 时间复杂度O(nk):设数据量为n、数据为d进制、最大位数为k,则对某一位执行计数排序使用O(n+d)时间,排序所有k位使用O((n+d)k)时间。通常情况下,d和k都相对较小,时间复杂度趋向O(n)。
  • 空间复杂度O(n+d)、非原地排序:与计数排序相同,基数排序需要借助长度为n和d的数组rescounter
  • 稳定排序:当计数排序稳定时,基数排序也稳定;当计数排序不稳定时,基数排序无法保证得到正确的排序结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827221.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举办!

10月26日-27日,由测试开发校企联合培养联盟主办、韩山师范学院承办、测吧(北京)科技有限公司及<火焰杯>软件测试开发大赛组委会协办的第二届全国高校软件测试开发教育峰会在韩山师范学院隆重举行。本次峰会汇聚了来自全国各大高校的教师及企业嘉宾,旨在共同探讨软件测…

如何使用nssm将asp.net core/.net6/.net8的webapi项目、mvc项目、控制台项目等注册为windows服务

nssm工具可以将asp.net Framework、asp.net core、net6、.net8的webapi项目、mvc项目、控制台项目、winform项、WPF项目等注册为windows服务。 nssm可以将所有windows可执行文件注册为windows服务。 下面,使用nssm将asp.net8的webapi项目注册为windows服务为例:【第一步】开发…

转 分布式执行计划

###sample 1 https://open.oceanbase.com/blog/1100217?_gl=1*10gldye*_ga*Mjc3Nzg0NTIwLjE3MzA3ODg3NDI.*_ga_T35KTM57DZ*MTczMDc5NDE2Ny4yLjEuMTczMDc5NTk5NC42MC4wLjA.本文介绍 OceanBase 的 SQL 执行类型。分布式数据库下数据分布在各个节点,SQL 很有可能会跨节点取数据。…

中公网校视频课件课程下载工具,如何在电脑端下载中公网校视频课件资料到本地?

一. 安装中公网校课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/eoffcn_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无止…

后端整合 Swagger + Knife4j 接口文档

后端整合 Swagger + Knife4j 接口文档什么是接口文档?写接口信息的文档,每条接口包括:请求参数 响应参数错误码接口地址 接口名称 请求类型 请求格式 备注who 谁用?一般是后端或者负责人来提供,后端和前端都要使用 为什么需要接口文档?有个书面内容(背书或者归档),便于…

start-all.sh脚本启动Hadoop的NameNode、DataNode、ResourceManager和NodeManager失败

今天在做大数据实验时,在终端,start-all.sh脚本启动Hadoop的NameNode、DataNode、ResourceManager和NodeManager失败,出现下面的错误信息: [root@node1 hadoop]# ./sbin/start-all.shStarting namenodes on [node1]ERROR: Attempting to operate on hdfs namenode as rootE…

Dash 2.18.2版本更新:模式匹配回调性能大提升

本文示例代码已上传至我的Github仓库:https://github.com/CNFeffery/dash-master Gitee同步仓库地址:https://gitee.com/cnfeffery/dash-master大家好我是费老师,今天Dash发布了2.18.2版本更新,虽然只是一次小版本更新,但其中涉及到的一些内容还是非常重要的,今天的文章中…

华为云:弹性负载均衡健康检查异常

动态负载均衡健康检查异常 健康检查基本配置如下: 其中内网IP和默认业务端口可以在负载均衡服务器→后端服务器组中查看即实际上的监听对象为192.168.0.170:8889。 健康检查异常说明健康检查curl这两个监听未返回200,去网络控制台→访问控制:安全组→default→入方向规则,查…

合规监管新趋势!智能合同审查免费体验,提升法律行业合同管理效率

思通数科 思通数据 思通数科推出的智能合同审查系统为这些痛点提供了解决方案。借助大模型、OCR和信息抽取等先进技术,系统具备高效要素抽取、自动分类、合同比对和合同审查等功能。以下是该系统的主要功能及用户体验案例,展示了在法律行业中的实际应用效果。应用案例:法律行…

UE Slate渲染流程

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!一、前言本文将深入探讨Slate的渲染流程及其相关细节。将详细讲解Slate如何将UI元素渲染到屏幕上,以及它是如何处理各种渲染细节以实现…

【HT-030-Div.1】核桃NOIP组周赛 赛后总结

总结T2爆零了,核桃oj不能缩放 别人题目(100%)我的题目(125%)

PCIe系列专题之二:2.5 Flow Control缓存架构及信用积分

一、故事前传 之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transaction layer), 数据链路层(Data link layer)和物理层(Physical layer)。较为详细解释请见之前的文章: 1. PCIe技…