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

适用场景

  • 整数或字符串排序(需调整位数处理逻辑)。
  • 数据范围广但位数较少时效率高。
  • 不适用于浮点数或非均匀分布数据。
相关推荐
Gigavision2 小时前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp2 小时前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
彧azz3 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外4 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55234 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
漂流瓶jz6 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
叠层归一研究院7 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia8 小时前
Diffusion Model 的基本原理与模型架构
算法
wabs6669 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin039 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode