数据结构:基数排序

news2024/9/23 11:26:11

基数排序(radix sorting)

实现排序主要是通过关键字之间的比较和移动记录这两种操作来完成的,而实现基数排序不需要进行关键字间的比较,而是利用“分配”和“收集”两种基本操作。

例如,我们可以用分配和收集的方法来对扑克牌进行“排序”
已知扑克牌中 52 张牌面的次序关系为
在这里插入图片描述
可以认为,每一张牌有两个“关键字”:

花色
花色(品<)和面值(2<3<···<A),
面值
在这里插入图片描述

且“花色”的地位高于“面值”。在比较任意两张牌面的大小时,必须先比较“花色”,若“花色”相同则再比较面值。由此,按上述次序关系排列扑克牌时,通常采用的办法是:先按不同“花色“分成有次序的 4 堆,每一堆的牌均具有相同的“花色”,然后分别对每一堆按“面值”大小整理有序。

也可以采用另一种办法:先按不同“面值”分成 13 堆,然后将这 13 堆牌从大到小叠在起(“A”在“K”之上,“K”在“Q”之上·…·最下面的是 4 张“2”),再重新按不同“花色”分成4堆,最后将这 4 堆牌按自小至大的次序合在一起(梅花在最上面,黑桃在最下面)便得到满足式所示的次序关系,如下图所示。

在这里插入图片描述
基数排序的思想酷似这种理牌的方法。有的逻辑关键字可以看成由若干个关键字复合而成的。例如,若关键字是数值,且其值都在 O<=k<=999 范围内,则可把每一个十进制数字看成一个关键字,即可认为k由 3 个关键字(k2,k1,k0)组成,其中 k2 是百位数,k1 是十位数,k0是个位数;又若关键字 k 是由5 个字母组成的单词,则可看成是由 5 个关键字(k4,k3,k2,k1,k0)组成,其中每个字母 kj都是一个关键字,k0是最低位, k4是最高位。由于如此分解而得的每个关键字 kj都在相同的取值范围内,故可以按分配和收集的方法进行排序。假设记录的逻辑关键字由 d 个“关键字”构成,每个关键字可能取r个值,则只要从最低位关键字起,按关键字的不同值将记录“分配”到 r 个队列之后再“收集”在一起,如此重复 d 趟,最终完成整个记录序列的排序。按这种方法实现的排序称为基数排序,其中“基数”指的是r的取值范围,上述由数字、字母构成的这两种关键字的基数分别为“10”和“26”。

例如,对关键字为(78,09,63,30,74,89,94,25,05,69,18,83)的记录需进行两趟“分配”和“收集”。待排的原始记录如图 3.12(a)所示。第一趟分配对“个位数”进行,根据每个记录关键字个位数的值(0,1,…,9),将它们分配到 10 个队列中去,如图 3.12(b)所示,然后进行第一趟收集,即依个位数为 0,1,…,9 的顺序将记录连接在一起,如图 3.12©所示,之后再按关键字的“十位数”进行分配,分配结果如图 3.12(d)所示,第二趟收集的结果如图 3.12(e)所示,所得即为记录的有序序列。
在这里插入图片描述
对由顺序表表示法存储的记录进行基数排序可利用“计数”和“复制”的操作实现。分析图 3,12©和图 3,12(a)中记录所在不同位置可见,在©中的第一个记录显然应是对(a)中记录自左至右扫描遇到的第一个个位数最小的记录,关键字为 63 的记录在©中处在第二个位置是因为个位数为“0”、“1”、“2”的记录只有 1个,而由于个位数为“3”的记录有 2 个,则(a)中第一个个位数为“4”的记录在(c)中就应该处在第四个位置上,依此类推。由此可见只要对(a)中记录关键字的“个位数”进行自左至右的扫描计数,便可得到记录在(c)中应处的位置,类似.对(c)中记录关键字的“十位数”进行自左至右的扫描计数,便可得到记录在(e)中应处的位置。从(a)到 (c) 和从(c)到(e)需要一个辅助空间对记录进行“复制”操作,仍以上述关键字为例,利用“计数”和“复制”进行基数排序的过程如下图所示。

在这里插入图片描述

从上图可见,计数数组“累加”(count[i]=count[i]十count[i]=1,…,9) 后的值 count[i]表示记录中关键字该位数取值为“0”至“i”的记录总数,即“原记录数组”中最后一个关键字该位数取值为“i”的记录应该复制到“复制后的数组”中第 count[i]个分量中。例如上图 (b)中,count[5]=7,意味着关键字个位取“0”至“5”的记录共有 7 个。原记录中最后一个关键字个位为 5 的记录 05,复制到“复制后的数组”中第 7 个分量中,位置下标是6;05 前一个个位为 5 的记录 25 的位置下标是 6-1=5。

在描述基数排序的算法之前,尚需重新定义记录类型。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
假设记录的逻辑关键字由 d 位数字或字母组成,则需进行 d 躺基数排序,每一趟都要对n个记录进行“计数”和“复制”,则基数排序的时间复杂度为 O(dXn),由于在复制过程中需要和记录数等量的辅助空间,因此它的空间复杂度为 O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Time-distributed 的理解

前言 今天看到论文中用到 Time-distributed CNN&#xff0c;第一次见到 Time-distributed&#xff0c;不理解是什么含义&#xff0c;看到代码实现也很懵。不管什么网络结构&#xff0c;外面都能套一个TimeDistributed。看了几个博客&#xff0c;还是不明白&#xff0c;问了问C…

Python数据挖掘基础

一、Matplotlib 画二维图表的python库&#xff0c;实现数据可视化 &#xff0c; 帮助理解数据&#xff0c;方便选择更合适的分析方法1、折线图1.1引入matplotlibimport matplotlib.pyplot as plt %matplotlib inlineplt.figure() plt.plot([1, 0, 9], [4, 5, 6]) plt.show()1.2…

知识探索项目测试报告

⭐️前言⭐️ 本篇文章是博主基于知识探索项目所做的测试报告&#xff0c;主要涉及到的测试知识有设计测试用例、自动化测试等测试知识。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录收获…

基于springboot+vue的药物咨询平台

基于springbootvue的药物咨询平台 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&…

二阶段提交事务的实现和缺点

背景 说起分布式事务&#xff0c;我们最绕不开的一个话题就是该不该使用分布式事务&#xff0c;而要理解为什么做出使用与否的决定&#xff0c;就必须要提到分布式事务中的最经典的实现&#xff1a;两阶段提交事务,本文我们就简答介绍下这个两阶段提交事务以及它的优缺点 技术…

【Opencv 系列】 第6章 人脸检测(Haar/dlib) 关键点检测

本章内容 1.人脸检测&#xff0c;分别用Haar 和 dlib 目标&#xff1a;确定图片中人脸的位置&#xff0c;并画出矩形框 Haar Cascade 哈尔级联 核心原理 &#xff08;1&#xff09;使用Haar-like特征做检测 &#xff08;2&#xff09;Integral Image : 积分图加速特征计算 …

SpringSecurity的权限校验详解说明(附完整代码)

说明 SpringSecurity的权限校是基于SpringSecurity的安全认证的详解说明(附完整代码) &#xff08;https://blog.csdn.net/qq_51076413/article/details/129102660&#xff09;的讲解&#xff0c;如果不了解SpringSecurity是怎么认证&#xff0c;请先看下【SpringSecurity的安…

【1792. 最大平均通过率】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 一所学校里有一些班级&#xff0c;每个班级里有一些学生&#xff0c;现在每个班都会进行一场期末考试。给你一个二维数组 classes &#xff0c;其中 classes[i] [passi, totali] &#xff0c;表示你…

0xL4ugh 2023

这回跟着个队伍跑&#xff0c;不过还是2X以后的成绩&#xff0c;前边太卷了。自己会的部分&#xff0c;有些是别人已经提交了的。记录一下。Cryptocrypto 1给了一些数据&#xff0c;像这样就没有别的了ct [0, 1, 1, 2, 5, 10, 20, 40, 79, 159, 317, 635, 1269, 2538, 5077, 1…

2023.02.19 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.方法5.1 Local Representation Learning5.2 Global Representation Learning5.3 Item Similarity Gating6.实验6.1 数据集6.2 结果7.结论深度学习1.对偶问题1.1 拉格朗日乘数法1.2 强对偶性2.SVM优化3.软间隔3.1 解决问题3.…

尚医通 (十八)微信登录

目录一、生成微信登录二维码1、准备工作2、后端开发service_user3、前端显示登录二维码4、二维码出现不了进行调试二、开发微信扫描回调1、准备工作2、后台开发3、前台开发三、分析代码四、bug一、生成微信登录二维码 1、准备工作 1、注册 2、邮箱激活 3、完善开发者资料 4、…

JSP中http与内置对象学习笔记

本博文讲述jsp客户端与服务器端的http、jsp内置对象与控制流和数据流实现 1.HTTP请求响应机制 HTTP协议是TCP/IP协议中的一个应用层协议&#xff0c;用于定义客户端与服务器之间交换数据的过程 1.1 HTTP请求 HTTP请求由请求行、消息报头、空行和请求数据4部分组成。 请求行…

ThreeJS 之界面控制

文章目录参考描述界面自适应问题resize 事件修改画布大小修改视锥体的宽高比全屏显示dblclick 事件检测全屏显示状态进入全屏显示状态退出全屏显示状态尾声参考 项目描述ThreeJS官方文档哔哩哔哩老陈打码搜索引擎BingMDN 文档document.mozFullScreenElementMDN 文档Element.re…

LeetCode题目笔记——6359. 替换一个数字后的最大差值

文章目录题目描述题目链接题目难度——简单方法一&#xff1a;替换代码/Python代码优化总结题目描述 给你一个整数 num 。你知道 Danny Mittal 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。 请你返回将 num 中 恰好一个 数字进行替换后&#xff0c;得到的最大值和最小值…

CTK学习:(一)编译CTK

CTK插件框架简介 CTK Plugin Framework是用于C++的动态组件系统,以OSGi规范为模型。在此框架下,应用程序由不同的组件组成,遵循面向服务的方法。 ctk是一个开源项目,Github 地址:https://github.com/commontk。 源码地址commontk/CTK: A set of common support code for…

信小程序点击按钮绘制定制转发分享图

1. 说明 先上代码片断分享链接&#xff1a; https://developers.weixin.qq.com/s/vl3ws9mA72GG 使用 painter 画图 按钮传递定制化信息 效果如下&#xff1a; 2. 关键代码说明 文件列表如下&#xff1a; {"usingComponents": {"painter": "/com…

基于springboot的停车场管理系统(程序+文档)

大家好✌&#xff01;我是CZ淡陌。将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。 &#x1f345;更多优质项目&#x1f447;&#x1f…

Android实例仿真之二

目录 三 从无入手 第一阶段 第二阶段 第三阶段 第四阶段 第五阶段 第六阶段 第七阶段 八 举两个典型例子&#xff1a; 九 逆向工程 三 从无入手 这节标题叫从无入手&#xff0c;什么意思呢&#xff1f;如果没有Android这个实例存在&#xff0c;你要做一个类似Android…

Mysql数据库事务

数据库事务 数据库事务由一组sql语句组成。 所有sql语句执行成功则事务整体成功&#xff1b;任一条sql语句失败则事务整体失败&#xff0c;数据恢复到事务之前的状态。 Mysql 事务操作 开始事务 start transaction;- 或 begin;事务开始后&#xff0c;对数据的增删改操作不…

MySQL最佳实践

一、MySQL查询执行过程 1.MySQL分层结构 MySQL8.0没有查询缓存的功能了,如果频繁修改缓存,将会损耗性能查询流程就按照分层结构就可以清楚,只要了解各个组件的各自功能就行分析器主要分析语法和词法是否正确优化器主要优化SQL语句 二、MySQL更新执行过程 更新主要涉及两个重…