数据结构:基数排序(c++实现)

个人主页 : 个人主页

个人专栏 : 《数据结构》 《C语言》《C++》《Linux》《网络》 《redis学习笔记》

文章目录


基数排序的定义和基本原理

基数排序(Radix Sort)是一种非比较型整数排序算法,其基本原理是根据数字的每一位来进行排序。具体来说,基数排序通过将整数按位数切割成不同的数字,然后按每一位数进行排序(不断接近有序的过程),最终得到有序序列。


基本原理

  1. 按位排序:基数排序从最低有效位(Least Significant Digit, LSD) 或 最高位有效位(Most Significant Digit, MSD)开始,逐位进行排序。对于有d位的整数(排序整数的最长长度d),需要进行d趟排序。
  2. 使用桶排序:在每一轮排序中,将待排序的数字分配到不同的桶中,每个桶代表一个特定的数字范围。然后,从桶中取出数字并从新组合,形成新的有序序列
  3. 重复排序:重复上述过程,直到所有位数都排序完成。

具体步骤

  1. 确定最大值:找出待排序数组中的最大值,以确定需要进行多少趟排序
  2. 分配和搜集:根据当前位数,将每一个数字分配到相应的桶中,然后从桶中收集数字
  3. 重新排序:重复上述过程,直到所有位数都排序完成

下面列子,采用LSD:从最低位开始排序,逐步向上进行



基数排序的优缺点:

优点:

  1. 时间复杂度低:基数排序的时间复杂度为O(nk), 其中n是待排序元素的数量,k是最大数的位数。

  2. 稳定性:基数排序是稳定的排序算法,相同值的元素在排序后保持其原有的顺序。

  3. 适用于大规模数据:基数排序特别适合处理大规模整数排序,能够有效利用计算机的并行处理能力
    缺点:

  4. 空间复杂度高:基数排序需要额外的空间来存储中间结果,空间复杂度为O(n + k)或O(n + r),其中r是桶的数量

  5. 适用范围有限:基数排序主要用于整数排序,对于浮点数或字符串等其它类型的数据,需要进行额外的转换或处理

  6. 位数限制:当待排序元素位数较多时,基数排序的效率会下降,因为需要进行更多的轮次分类


代码实现

cpp 复制代码
// 基数排序,核心思想是通过逐位排序实现整体有序
// 使用到queue,[0, 9]个queue来排列每一位
void RadixSort(vector<int>& arr) {
	int size = arr.size();
	if (size == 0)
		return;
	// 找到最大值,确认最大位数
	int maxVal = arr[0];
	for (int i = 1; i < size; ++i) {
		if (maxVal < arr[i])
			maxVal = arr[i];
	}
	int maxDigits = to_string(maxVal).length();
	// 初始化10个队列
	vector<queue<int>> buckets(10);
	// 逐位排序
	for (int i = 0; i < maxDigits; ++i) {
		int divisor = pow(10, i);
		// 分配元素到桶中
		for (int j = 0; j < size; ++j) {
			int index = arr[j] / divisor % 10;	// 获取当前位数
			buckets[index].push(arr[j]);
		}
		// 从桶中收集元素
		int index = 0;
		for (int j = 0; j < 10; ++j) {
			while (!buckets[j].empty()) {
				arr[index++] = buckets[j].front();
				buckets[j].pop();
			}
		}
	}
}

总结

以上就是我总结的C++面试题,TCP和UDP方面(1)

相关推荐
OKkankan5 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
蓝速科技5 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
白远山5 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
fpcc6 小时前
计算机原理—构建过程中的分段分析
c++
xxwxx__6 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
Logic1016 小时前
C语言/数据结构数组题解:数字列表加一(Plus One)——进位处理与数组扩展
c语言·数据结构·模拟·数组·时间复杂度·算法题·进位
Escalating_xu6 小时前
【C语言常见概念】从第一行代码到字符串结束标志:一次打通编译、main、ASCII、转义字符与注释
c语言·c++
DevRay6 小时前
Java 21虚拟线程深度实战:告别线程池焦虑,百万并发吞吐量直接翻倍(原理+代码+避坑)
java·开发语言
bnmoel6 小时前
C++ 基础入门篇(三):内联函数与空指针
c++·内联函数·nullptr·低层
码匠许师傅6 小时前
【C++三方组件】TinyXML2:两个文件的极简 XML 解析器
xml·c++