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

适用场景

  • 整数或字符串排序(需调整位数处理逻辑)。
  • 数据范围广但位数较少时效率高。
  • 不适用于浮点数或非均匀分布数据。
相关推荐
im_AMBER11 分钟前
Leetcode 47
数据结构·c++·笔记·学习·算法·leetcode
kyle~21 分钟前
算法数学---差分数组(Difference Array)
java·开发语言·算法
橘颂TA1 小时前
机器人+工业领域=?
算法·机器人
_OP_CHEN1 小时前
C++进阶:(七)红黑树深度解析与 C++ 实现
开发语言·数据结构·c++·stl·红黑树·红黑树的旋转·红黑树的平衡调整
小O的算法实验室2 小时前
2025年TRE SCI1区TOP,随机环境下无人机应急医疗接送与配送的先进混合方法,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小白程序员成长日记2 小时前
2025.11.06 力扣每日一题
算法·leetcode
不穿格子的程序员2 小时前
从零开始写算法-栈-最小值(记忆化pair)
数据结构·
暴风鱼划水2 小时前
算法题(Python)数组篇 | 4.长度最小的子数组
python·算法·力扣
gugugu.2 小时前
算法:二分算法类型题目总结---(含二分模版)
算法
大G的笔记本2 小时前
算法篇常见面试题清单
java·算法·排序算法