【数据结构】基数排序的原理及实现

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在准备26考研
✈️专栏:数据结构
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、什么是基数排序
  • 二、基数排序的过程(图画)
  • 三、代码实现
  • 四、基数排序的时空复杂度分析
  • 五、基数排序的使用场景

一、什么是基数排序

我们以往学习的排序算法,诸如快速排序、选择排序、冒泡排序等,主要是通过关键字之间的比较和移动数据这两种方法实现的。而基数排序是一种非比较的排序算法,其核心思想是将数值拆分为各个位上的数字,按照这些位上的数字的大小依次进行排序

常见的排序策略有:

  • 最高位优先(MSD,Most Significant Digit):从数据的最高位开始排序,即先对最高位进行排序,然后依次处理低位。
  • 最低位优先(LSD, Least Significant Digit):从数据的最低位开始进行排序,即先对个位排序,然后对十位排序,接着对百位排序,依此类推。

大致的过程就是:可以想象用一个“桶”来存放不同位上的数字,如果排序的对象都是十进制数据。在每一位的排序过程中,将每一位的值放入对应的桶中,再将桶中的数据按顺序取出,进行下一轮排序,直至序列有序为止。值得一提的是,从桶中按顺序取数据的过程可以抽象成一个队列(先进先出)。因此,基数排序本质就是分发数据 + 回收数据的过程

以上文字理解如果抽象的话,接下来我带大家画图理解。

二、基数排序的过程(图画)

假设有如下序列:[278, 109, 63, 930, 589, 184, 505, 269, 8, 83]。以最低位优先策略为例。

  • 第一轮分发和回收

请添加图片描述

  • 第二轮分发和回收

请添加图片描述

  • 第三轮分发和回收
    请添加图片描述

三、代码实现

#define MAX_DIGIT 3 // 序列的最大位数
#define RADIX 10 // 桶的个数
// 因为拍的是十进制数,所以桶的个数给10个就足够了

// 数值第k次分发的位值
int GetKey(int value, int k)
{
	int res = 0;
	while (k >= 1)
	{
		res = value % 10;
		value /= 10;
		k--;
	}
	return res;
}

// 分发数据
void Distribute(int a[], int n, int time, queue<int> q[RADIX])
{
	for (int i = 0; i < n; i++) // 遍历数组
	{
        // 我们要知道当前数要放在哪个桶
		int key = GetKey(a[i], time);
		q[key].push(a[i]);
	}
}

// 回收
void collect(int a[], queue<int> q[RADIX])
{
	int j = 0;
	for (int i = 0; i < RADIX; i++) // 遍历桶
	{
		while (q[i].size() != 0)
		{
			a[j] = q[i].front();
			j++;
			q[i].pop();
		}
	}
}

void radix_sort(int a[], int n)
{
	queue<int> q[RADIX]; // 用队列来模拟桶
    // 最多要 分配+回收 序列中的最大位数次
	for (int i = 1; i <= MAX_DIGIT; i++) 
	{
		// 分发数据
		Distribute(a, n, i, q); // 传入i表示分发到第几位了
		// 回收数据
		collect(a, q);
	}
}

【测试结果】

在这里插入图片描述

四、基数排序的时空复杂度分析

时间复杂度:

  • 对于分发操作:对每个元素,都需要计算当前位的键值,并将其放入对应的桶中。对于每一轮的排序,分配操作需要遍历所有的元素,因此时间复杂度是O(n),其中n是元素的个数。

  • 对于回收操作:每轮排序时,所有桶中的元素需要按顺序重新收集到数组中。对于每一轮的排序,收集操作也需要遍历所有的元素,因此时间复杂度是O(n)

因此,基数排序的时间复杂度是 O(n * d)。其中,n是元素个数,d是数字的最大位数。

空间复杂度:

  • 存储桶:每个桶是一个队列,最多存储n个元素。由于桶的数量是固定的(10个桶),因此桶所占用的空间是O(n)

因此,基数排序的空间复杂度是O(n)

五、基数排序的使用场景

基数排序通常不直接用于带有负数和浮点数的数据。这是因为在处理负数和浮点数时,基数排序的使用会比较复杂。而它的设计主要是针对非负整数的排序。它通常用于处理具有较为固定的数值长度,并且长度不能过大。长度过大就会导致基数排序的时间复杂度近似为O(n^2)

其应用场景包括但不限于:

  1. 整数排序:当数据为整数时,尤其是在数字范围相对较小且数据量很大的情况下,基数排序表现尤为出色。例如:排序手机号码、身份证号码、邮政编码、学号等。
  2. 字符串排序:基数排序也可以应用于字符串排序,尤其是当字符串的长度固定或者长度较短时。基数排序通过逐字符(ASCII码)排序来实现字符串排序,适用于字典序排列等场景。例如:排序带有前缀的字符串,如URL、文件名等。
  3. 时间戳排序:基数排序也适用于需要根据时间戳排序的应用场景。时间戳通常是由年月日时分秒等组成,基数排序能够高效处理。
  4. ...

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opencv-python的简单练习

一、编程题 读取一张彩色图像并将其转换为灰度图。 import cv2# 读取彩色图像 image_path path_to_your_image.jpg # 替换为你的图像路径 color_image cv2.imread(image_path)# 检查图像是否成功加载 if color_image is None:print("图像加载失败&#xff0c;请检查图…

Python鼠标轨迹算法(游戏防检测)

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序&#xff0c;它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言&#xff0c;原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势&#xff1a; 模拟…

【USB-HID】“自动化键盘“ - 模拟键盘输入

目录 【USB-HID】"自动化键盘" - 模拟键盘输入1. 前言2. 模拟键盘2.1 STM32CubeMX 配置2.2 修改代码配置2.3 发送按键信息 3. 接收主机Setup数据3.1 获取PC下发的数据 4. 总结 【USB-HID】“自动化键盘” - 模拟键盘输入 1. 前言 对于模拟键盘的实现&#xff0c;网…

图-遍历(DFS+BFS)

图-遍历 1.简介2.深度优先遍历dfs3.广度优先遍历bfs4.具体问题4.1 岛屿的最大面积4.2 岛屿的数量 5.总结 1.简介 图是数据结构中的另一种数据结构&#xff0c;通常用来表示多对多的关系。在 C 中&#xff0c;图通常可以通过邻接表或邻接矩阵表示。 例如&#xff1a; 2.深度优…

python中向量指的是什么意思

一、向量是什么 在数学中&#xff0c;向量&#xff08;也称为欧几里得向量、几何向量、矢量&#xff09;&#xff0c;指具有大小&#xff08;magnitude&#xff09;和方向的量。它可以形象化地表示为带箭头的线段。箭头所指&#xff1a;代表向量的方向&#xff1b;线段长度&am…

Vulhub:Log4j[漏洞复现]

CVE-2017-5645(Log4j反序列化) 启动靶场环境 docker-compose up -d 靶机IPV4地址 ifconfig | grep eth0 -A 5 ┌──(root㉿kali)-[/home/kali/Desktop/temp] └─# ifconfig | grep eth0 -A 5 eth0: flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 in…

[OpenGL] Transform feedback 介绍以及使用示例

一、简介 本文介绍了 OpenGL 中 Transform Feedback 方法的基本概念和代码示例。 二、Transform Feedback 介绍 1. Transform Feedback 简介 根据 OpenGL-wiki&#xff0c;Transform Feedback 是捕获由顶点处理步骤&#xff08;vertex shader 和 geometry shader&#xff0…

探秘 AI Agent 之 Coze 智能体:从简介到搭建全攻略(4/30)

一、Coze 智能体概述 &#xff08;一&#xff09;Coze 智能体是什么 Coze 智能体是基于机器学习和自然语言处理技术的软件实体&#xff0c;它在人工智能领域扮演着重要的角色&#xff0c;能够像一个智能助手一样&#xff0c;通过与外界环境进行交互学习&#xff0c;进而执行各…

游戏引擎学习第47天

仓库: https://gitee.com/mrxiao_com/2d_game 昨天我们花了一点时间来修复一个问题&#xff0c;但基本上是在修复这个问题的过程中&#xff0c;我们决定添加一个功能&#xff0c;那就是在屏幕上控制多个实体。所以如果我有一个手柄&#xff0c;我可以添加另一个角色&#xff0…

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…

RabbitMQ实现消息发送接收——实战篇(路由模式)

本篇博文将带领大家一起学习rabbitMQ如何进行消息发送接收&#xff0c;我也是在写项目的时候边学边写&#xff0c;有不足的地方希望在评论区留下你的建议&#xff0c;我们一起讨论学习呀~ 需求背景 先说一下我的项目需求背景&#xff0c;社区之间可以进行物资借用&#xff0c…

计算机进制的介绍

一.进制介绍 对于整数&#xff0c;有四种表示方式: 1&#xff09;二进制:0,1&#xff0c;满2进1。 在golang中&#xff0c;不能直接使用二进制来表示一个整数&#xff0c;它沿用了c的特点。 参考:Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 //赋值…

基于卷积神经网络的Caser算法

将一段交互序列嵌入到一个以时间为纵轴的平面空间中形成“一张图”后&#xff0c;基于卷积序列嵌入的推荐&#xff08;Caser&#xff09;算法利用多个不同大小的卷积滤波器&#xff0c;来捕捉序列中物品间的点级&#xff08;point-level&#xff09;、联合的&#xff08;union-…

基于STM32设计的粮食仓库(粮仓)环境监测系统

一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘&#xff08;实时更新项目内容&#xff09;&#xff1a;https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 随着现代农业的发展和粮食储存规模的…

计算机网络-传输层 TCP协议(上)

目录 报头结构 TCP的可靠传输机制 核心机制一&#xff1a;确认应答 TCP的序号和确认序号 核心机制二&#xff1a;丢包重传 核心机制三&#xff1a;连接管理 建立连接-三次握手 断开连接-四次挥手 核心机制四&#xff1a;滑动窗口 数据包已经抵达, ACK被丢了 数据包就…

【经验分享】容器云运维的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

纯血鸿蒙崛起,原生Android挑战?两大操作系统巅峰对决,智能设备未来谁主沉浮?

鸿蒙HarmonyOS和原生Android系统虽然在一些方面相似&#xff0c;但在架构、设计理念、API、开发工具等方面存在一些差异。鸿蒙系统的目标是跨设备、分布式的操作系统&#xff0c;强调多设备协同和资源共享&#xff0c;而Android则主要集中在智能手机和移动设备领域。 下面将从…

新手快速入门!低功耗4G模组Air780E——使用文件系统存储温湿度数据来啦~

小伙伴们&#xff0c;今天我们来学习低功耗4G模组Air780E快速入门之使用文件系统存储温湿度数据。一起接着看下去吧&#xff01; 一、编写脚本 1.1 准备资料 780E开发板 780E开发板设计资料 LuatOS-Air780E-文件系统的使用-程序源码demo TCP/UDP测试服务器 API使用介绍 …

vscode中插件ofExtensions的debug模式也无法查看U、p等openfoam中foam类型的变量

插件介绍&#xff1a; 主要内容如下&#xff1a; 以自编译的$HOME/OpenFOAM-7例&#xff0c;如果OFdebugopt设置为WM_COMPILE_OPTIONDebug&#xff0c;那最终的激活环境的命令为source $HOME/OpenFOAM/OpenFOAM-8/etc/bashrc WM_COMPILE_OPTIONDebug&#xff0c;这时候$FOAM_…

【收藏】Cesium 限制相机倾斜角(pitch)滑动范围

1.效果 2.思路 在项目开发的时候&#xff0c;有一个需求是限制相机倾斜角&#xff0c;也就是鼠标中键调整视图俯角时&#xff0c;不能过大&#xff0c;一般 pitch 角度范围在 0 至 -90之间&#xff0c;-90刚好为正俯视。 在网上查阅了很多资料&#xff0c;发现并没有一个合适的…