新手向 算法 基数排序-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),需要额外的计数数组和输出数组。
  • 稳定性:基数排序是稳定的,因依赖的计数排序是稳定的。

适用场景

  • 整数或字符串排序(需调整位数处理逻辑)。
  • 数据范围广但位数较少时效率高。
  • 不适用于浮点数或非均匀分布数据。
相关推荐
leiming614 小时前
C++ vector容器
开发语言·c++·算法
JAY_LIN——815 小时前
指针-数组
c语言·排序算法
Xの哲學15 小时前
Linux流量控制: 内核队列的深度剖析
linux·服务器·算法·架构·边缘计算
yaoh.wang16 小时前
力扣(LeetCode) 88: 合并两个有序数组 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·双指针
LYFlied17 小时前
【每日算法】 LeetCode 56. 合并区间
前端·算法·leetcode·面试·职场和发展
艾醒17 小时前
大模型原理剖析——多头潜在注意力 (MLA) 详解
算法
艾醒17 小时前
大模型原理剖析——DeepSeek-V3深度解析:671B参数MoE大模型的技术突破与实践
算法
jifengzhiling18 小时前
零极点对消:原理、作用与风险
人工智能·算法
鲨莎分不晴18 小时前
【前沿技术】Offline RL 全解:当强化学习失去“试错”的权利
人工智能·算法·机器学习