新手向 算法 基数排序-yang

基数排序原理

基数排序是一种非比较型整数排序算法,通过将整数按位数切割成不同的数字,然后按每个位数分别比较。排序过程从最低位(LSD)或最高位(MSD)开始,依次对每一位进行稳定排序(如计数排序)。

基数排序步骤

1. 确定最大数的位数 找到数组中最大元素的位数,决定需要多少轮排序。

2. 按位排序 从最低位到最高位(或相反),对每一位进行稳定排序(常用计数排序)。每次排序后,数组会基于当前位有序。

3. 合并结果 所有位处理完成后,数组整体有序。


C++实现示例

cpp 复制代码
//基数排序
//求出数组arr里面的最大值的位数:例如最大值是12345->5,123456->6
int Get_Arr_MaxNum_Figure(int arr[], int len){
	assert(arr != NULL);
	int max_num = arr[0];
	for (int i = 1; i < len; i++)if (arr[i] > max_num)max_num = arr[i];
	if (max_num == 0)return 1;
	int count = 0;//2.获取这个最大值的位数
	while (max_num != 0){
		max_num /= 10;
		count++;
	}return count;
}
int Get_Num_BucketNum(int num, int figure){//取每个数字的个位
	for (int i = 0; i < figure; i++)num /= 10;
	return num % 10;
}
void Radix(int arr[], int len, int figure){
	std::queue<int> Bucket[10];//0.十个桶(队列)//1.将所有的值放到对应的桶内(放进去操作)
	for (int i = 0; i < len; i++){
		//先确定一下,此时i指向的这个值arr[i],它应该放到对应的几号队列中
		int index = Get_Num_BucketNum(arr[i], figure);
		Bucket[index].push(arr[i]);//确定好之后,直接放
	}
	//2.将0->9号队列中的值,依次取出(取出来操作)
	int k = 0;//k指向当前arr的插入位置
	for (int j = 0; j <= 9; j++){
		while (!Bucket[j].empty()){
			arr[k++] = Bucket[j].front();
			Bucket[j].pop();
		}
	}
}

复杂度分析

  • 时间复杂度 :O(d*(n+k)),其中d为最大位数,n为元素数量,k为基数(如10)。
  • 空间复杂度:O(n+k),需要额外的计数数组和输出数组。
  • 稳定性:基数排序是稳定的,因依赖的计数排序是稳定的。

适用场景

  • 整数或字符串排序(需调整位数处理逻辑)。
  • 数据范围广但位数较少时效率高。
  • 不适用于浮点数或非均匀分布数据。
相关推荐
海清河晏1113 小时前
数据结构 | 单循环链表
数据结构·算法·链表
wuweijianlove7 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong7 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志7 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光7 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_117 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia7 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg8 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒8 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾8 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio