【数据结构】8.6 基数排序

news2024/11/14 19:43:31

文章目录

  • 基数排序定义
  • 基数排序算法
  • 基数排序算法分析

基数排序定义

前述的各类排序方法都是建立在关键字啊比较的基础上,而分配类排序不需要比较关键字的大小,它是根据关键字中各位的值,通过对待排序记录进行若干趟分配收集来实现排序的,是一种借助于多关键字排序的思想对单关键字排序的方法。基数排序是典型的分配类排序

  • 基数排序也叫桶排序箱排序

  • 基本思想:分配 + 收集。

    • 分配:设置若干个箱子,将关键字为 k 的记录放入第 k 个箱子;
    • 收集:然后在按序号将这第 k 个箱子里的内容再拿出来链接在一起。
  • 基数排序:数字是有范围的,均由 0 - 9 这是个数字组成,则只需要设置十个箱子,相继按照个、十、百…进行排序。

举个例子

现在这样一组数据进行排序(614,738,921,485,637,101,215,530,790,306)

  • 这一堆数据的每一位数都是由 0-9 这十个数字构成的。
  • 准备 0-9 这十个箱子,把这些数扔到这些箱子里去。

在这里插入图片描述

  1. 第一趟分配:按个位排,个位是多少就扔到哪个箱子里,如:614 就扔到 4 号箱子去。
    • 分配完成之后,将个位数按照 0-9 的顺序将这些数据收集回来。
    • 收集回来之后,这些数据的个位就有序了。

在这里插入图片描述

  1. 第二趟分配:按十位排
    • 分配完成之后,再将十位按照从 0-9 的顺序把它们收集回来。

在这里插入图片描述

  1. 第三趟收集:按百位排
    • 分配完之后再来一次收集,此时所有的数据已经有序递增了。

在这里插入图片描述

基数排序口诀

  • 三分三收,个十百

基数排序算法

算法实现时采用静态链表, 以便于更有效的存储和重排记录。

相关数据类型的定义

#define MAXNUM_KEY 8 //关键字项的最大值
#define RADIX 10	//关键字基数,此时是十进制整数的基数
#define MAX_SPACE 10000

typedef struct
{
		KeyType keys[MAXNUM_KEY];//关键字
		InfoType otheritems;	//其他数据项
		int next;
}SLCell;	//静态链表的结点类型

typedef struct
{
		SLCell r[MAX_SPACE];//静态链表的可利用空间,以r[0]为头结点
		int keynum;	//记录当前的关键字个数
		int rcnum;	//静态链表的当前长度
}SLList;	//静态链表类型

typedef int ArrType[RADIX];	//数组类型

基数排序算法描述

  • 分配算法
//静态链表L的r域中记录已按照(keys[0],...,key[i-1])有序
//本算法按照第i个关键字keys[i]建立RADIX个子表,使同一个子表中记录的keys[i]相同
//f[0...RADIX-1]和e[0...RADIX-1]分别指向各子表中第一个和最后一个元素
void Distribute(SLCell &r,int i,ArrType &f,ArrType &e)
{
		for(j = 0;j < RADIX;++j)
		{
				f[j] = 0;//将各子表初始化为空表
		}
		for(p = r[0].next;p;p = r[p].next)
		{
				j = ord(r[p].keys[i]);	//ord将记录第i个关键字映射到[0...RADIX-1]
				if(!f[j])
				{
						f[j] = p;
				}
				else
				{
						r[e[j]].next = p;
				}
				e[j] = p;	//将p所指向的结点插入第i个子表中
		}
}
  • 收集算法
//本算法按照keys[i]自小直大将f[0...RADIX-1]所指向的各子表依次连接成一个链表
//e[0...RADIX-1]为各个子表的尾指针
void Collect(SLCell &r,int i,ArrType f,ArrType e)
{
		for(j = 0;!f[j];j = succ(j));	//找第一个非空子表,succ为求后继函数
		r[0],next = f[j];t = e[j];		//r[0].next指向第一个非空子表中的第一个结点

		while(j < RADIX)
		{
				for(j = succ(j);j < RADIX-1 && !f[j];j = succ(j));//找下一个非空子表
				if(f[j])
				{
						//链接两个非空子表
						r[t].next = f[j];
						t = e[j];
				}
		}
		r[t].next = 0;	//让t指向最后一个非空子表中的最后一个结点
}
  • 基数排序
//对L采用静态链表表示的顺序表
//对L左基数排序,使得L成为按关键字自小到大的有序静态林彪,以L.r[0]为头结点
void RadixSort(SLList &L)
{
		for(i = 0;i < L.recnum;++i)
		{
				L.r[i].next = i+1;
		}
		L.r[L.recnum].next = 0;	//将L改造为静态链表
		for(i = 0;i < L.keynum;++i)	//按照最低位优先依次对各关键字进行分配和收集
		{
				Distribute(L.r,o.f.e);//第i趟分配
				Collect(L.r,i,f,e);//第i趟收集
		}
}

基数排序算法分析

时间复杂度

  • 时间效率:O(k * (n + m))
    • k:关键字个数(决定分配多少趟)
    • n:元素个数(每一趟需要分配多少个元素)。
    • m:关键字取值范围为 m 个值(桶的个数/进行收集的次数)。
  • 分配:基数排序需要进行元素分配。
    • 分配过程总共要做的次数:看关键字的个数,有 个、十、百 三个关键字就需要分配三次。
  • 收集:要将每个桶内的数据收集回来。
    • 收集的次数同样也是看关键字的个数。

空间复杂度

  • 空间效率:O(n + m)
  • 分配的时候要分配到 m 个桶里,收集回来的时候需要放在长度为 n 的数组中。

算法特点

  1. 稳定排序
  2. 可用以链式结构,也可用于顺序结构。
  3. 世界复杂度可以突破基于关键字比较一类方法的下界,O(nlog₂n),达到 O(n)。
  4. 技术排序使用条件有严格的要求:需要知道各级关键字的主次关系和各级关键字的取值范围。

下一节传送门:各排序方法比较

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

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

相关文章

微信小程序 Springboot卫生应急培训报名系统java

本文以微信开发者、Springboot框架、java为开发技术&#xff0c;实现了一个卫生应急培训小程序。卫生应急培训小程序的主要使用者分为管理员服务端和用户客户端&#xff0c;其中管理员服务端权限&#xff1a;首页、个人中心、用户管理、通知公告管理、在线学习管理、培训管理、…

中国电子学会2021年09月份青少年软件编程Python等级考试试卷一级真题(含答案)

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 取整除的运算符是&#xff1f;&#x…

每天一道大厂SQL题【Day02】

每天一道大厂SQL题【Day02】 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&#xff0c;以每日1题…

nuxt.js项目搭建

nuxt[文档数据] https://www.xuanmo.xin/details/3240 nuxt文档:https://zhuanlan.zhihu.com/p/76703748 nuxt文档:https://www.cnblogs.com/chanwahfung/p/12899714.html axios:https://axios.nuxtjs.org/ 参考:https://www.w3cschool.cn/nuxtjs/nuxtjs-b4kl36fw.html 案例实现…

编程的GCRoot应该怎么去找?

本文导读 本文通过抛出一个编程的上帝视角问题&#xff0c;我们了解什么是编程的上帝视角&#xff0c;编程如何学习以及编程的root是什么&#xff0c;找到root之后&#xff0c;我们有如何利用上帝视角去解决编程中的推理。 一、编程的上帝视角 上帝视角乃是叙述视角中&#…

23.网络编程(一)

目录 一.网络编程 1.1 什么是网络编程 1.2 网络通信基本模式 1.3 网络通信三要素 1.4 IP地址 1.4.1 什么是IP地址 1.4.2 IP的常见分类 1.4.3 IP地址基本寻路 1.4.4 IP地址形式 1.4.5 IP常用命令&#xff08;在命令提示符窗口中使用&#xff09; 1.4.6 特殊IP地址 1…

Docker安装Postgresql

测试环境&#xff1a;Centos7.x docker1.13.1 postgres12本文使用的是在镜像仓库直接pull的方式&#xff0c;非Dockfile的方式。Postgresql的Dockerfile参考&#xff1a;https://github.com/docker-library/postgres/blob/master/12/alpine/Dockerfile常用命令docker命令大全…

MySQL的卸载

步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服务。右击“此电脑“&#xff0c;选择”管理“&#xff0c;可以在“服务”列表找到“MySQL8.0”的服务&#xff0c;如果现在“正在运行”状态&#xff0c;可以右键单击服务&#xff0c;选择“停止”选…

java基础巩固-宇宙第一AiYWM:为了维持生计,大数据之Kafka【Kafka的概念、单机及集群部署】~整起

Rust一、Kafka基本概念1.Kafka是什么&#xff1f;Kafka与Flume&#xff1f;2.Kafka的整体架构&#xff1a;3.kafka的生产者与消费者&#xff1a;4.kafka的Topic与日志、分区【分区可以提高咱们kafka的写入能力和存储能力】5.kafka的顺序写入&#xff1a;6.kafka的零拷贝技术7.k…

MQ 队列消息

消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成,通过提供消息传递和消息排队模型,它可以在分布式环境下拓展进程间的通信,对于消息中间件,常见的角色大致也就有Producer(生产者).Consumer(消费者) MQ 消息中间件 消息队列 …

【数据结构基础】树 - 基础和Overview

知识体系结构树树是一种数据结构&#xff0c;它是n(n>0)个节点的有限集。n0时称为空树。n>0时&#xff0c;有限集的元素构成一个具有层次感的数据结构。区别于线性表一对一的元素关系&#xff0c;树中的节点是一对多的关系。树具有以下特点:n>0时&#xff0c;根节点是…

Linux嵌入式开发——文件权限

文章目录Linux嵌入式开发——文件权限文件权限文件权限管理修改文件权限修改文件所属用户拥有者拥有者组Linux嵌入式开发——文件权限 文件权限 文件权限是指不同的用户或用户组对某个文件拥有的权限&#xff0c;文件的权限分为三种&#xff0c;并且可以使用二进制表示文件权…

kerberos环境下parcel方式部署flink1.15.3 基于CDH6.3.2 Flink on Yarn

1.1 Flink on Yarn的优势相对于 Standalone 模式&#xff0c;在Yarn 模式下有以下几点好处&#xff1a;1.资源按需使用&#xff0c;提高集群的资源利用率&#xff1b;2.任务有优先级&#xff0c;根据优先级运行作业&#xff1b;3.基于 Yarn 调度系统&#xff0c;能够自动化地处…

通信原理笔记—模拟信号的数字编码

目录 低通与带通信号的抽样定理&#xff1a; 模拟信号数字编码的基本概念&#xff1a; 模拟信号的抽样&#xff1a; 低通信号的理想抽样&#xff1a; 低通采样定理&#xff1a; 采样方式&#xff1a; 冲激采样示例&#xff1a; 低通信号的自然抽样&#xff1a; 带通抽样…

正版授权|Charles 4 网络封包分析调试工具软件

Charles 4 是一款 HTTP 代理 /HTTP 监视器/反向代理&#xff0c;使开发人员能够查看其机器和 Internet 之间的所有 HTTP 和 SSL / HTTPS流量。这包括请求、响应和 HTTP 标头&#xff08;包含 Cookie 和缓存信息&#xff09;。 授权分类&#xff1a;单许可证 站点许…

Python程序设计-第2章Python程序语句

第2章Python程序语句一.预习笔记 1.1 if语句 if 条件 : 执行语句 注意&#xff1a;条件后面要有 : 号&#xff0c;其次条件不需要括号包裹&#xff0c;然后执行语句需要有缩进 1.2 if else语句 if 条件 : 执行语句1 else : 执行语句2 注意&#xff1a;条件成立执行语…

Vue3中使用Tinymce富文本编辑器(版本最新)

使用目录前言一、安装方法一&#xff08;npm、yarn下载&#xff09;二、安装方法二&#xff08;下载官网压缩包方法&#xff09;——推荐总结前言 最近使用了WangEditor编辑器和Tinymce编辑器&#xff0c;使用方法如下&#xff08;采用的编辑器版本是官网最新的&#xff09; 汉…

@Configuration 和 @Component 区别

本文参考1&#xff1a;https://blog.csdn.net/isea533/article/details/78072133 本文参考2&#xff1a;https://blog.csdn.net/weixin_52850476/article/details/124410800 一句话概括就是 Configuration 中所有带 Bean 注解的方法都会被动态代理&#xff0c;因此调用该方法…

数据库密码定期轮换(AWS版)

问题 需要定期轮换AWS上面的RDS数据库的密码&#xff0c;而且&#xff0c;需要让业务程序无感知。 思路 AWS有个一个aws-secretsmanager-jdbc库&#xff0c;只要在SpringBoot的基础上面集成即可&#xff0c;就可以使用secrets manager来定期轮换数据库的密码了。 解决步骤 …

Excel VBA 讲座05 - InputBox和MsgBox使用

本篇介绍的内容&#xff1a; 1&#xff0c;当用户使用宏或procedure时&#xff0c;使用InputBox来接收或收集用户输入的信息。 2&#xff0c;根据需求使用IF语句构建逻辑。 3&#xff0c;使用Message Box将信息展示给用户&#xff0c;比如用户输出错误&#xff0c;就提示用户…