C++ 基数排序

基数排序及其思想 C++代码实现及分析 恋上数据结构笔记 文章目录复习梗概算法思想时间及空间复杂度基数排序基础版代码 及输出结果计数排序函数基数排序函数可视化输出另一种思路完整版代码 复习梗概 思想 如何取数字各个位位数 计数排序保证稳定性怎么保证 算法思想 基数排序思想:本质是按照个位数字,十位数字,百位数字。。。分别对数组进行排序 在排序高位的时候,就把前面低位的最终顺序完全确定了,直到排到最高位就完全确定顺序 而因为每位数字都是0-9的范围,又正好可以采用计数排序 思想不难,主要把思想转换成代码有一定难度,要注意如何取到每一位上的位数:个位:X/1%1 阅读详情

基数排序的原理:

(1)首先,把整数通过求余的方式拆分成“个位、十位、百位、… ”;

(2)然后,统计每个整数的“个位、十位、百位、… ”出现的次数,之后把次数存到以“余数”为编号的桶子里;

(3)最后,通过一个整数出现的次数-1,从而算出正确顺序的位置,再把整数放进去,就有顺序了。

#include <iostream>
#include <stdlib.h>
using namespace std;

/*******************************************/
/*  基数排序
/******************************************/

/*设数组元素为X,
因为要统计个十百到高位,
所以要用求余公式:
  (1)个位数 =(X/1)%10;
  (2)十位数 =(X/10)%10;
  (3)百位数 =(X/100)%10;
  (4) ... ... ...
/**************************************/

int MaxDigit(int array[], int n)  //获取数组中最大元素有多少位
{
	int digit = 1;  //位数从个位开始
	int radix = 10; 
	for (int i = 0; i < n; i++)
	{
		while (array[i] >= radix)
		{
			radix = radix * 10;
			++digit;
		}
	}
	return digit;  //返回最大元素的位数
}


void RadixSort(int array[], int n)  //基数排序函数
{
	int digit = MaxDigit(array, n);
	int temp[6];  //这里以6个元素为例
	int buckets[10];  //数组元素的个、十、百位到高位都是在0~9之间,所以用10
	int base = 1;  //从个位开始
	int i, j, k;

	for( i  = 1; i <= digit; i++)
	{	
		for (j = 0; j < 10; j++)
		{
			buckets[j] = 0;  //初始化buckets[]数组
		}

		for (j = 0; j < n; j++)
		{
			k = (array[j] / base) % 10;  //求余
			buckets[k]++;  //把次数存储到以求余为编号的水桶内,假如余数是5,开始次数buckets[5] = 0, ++后存1次
		}
		    
		for (j = 1; j < 10; j++)
		{
			buckets[j] = buckets[j - 1] + buckets[j];  //统计存储在水桶里元素的总次数
		}

		for (j = n - 1; j >= 0; j--)
		{
			k = (array[j] / base) % 10;  //求余
			temp[buckets[k] - 1] = array[j];  //把array[]数组元素赋给已经排好位置的temp[]数组
			buckets[k]--;  //水桶里元素的总次数减少
		}

		for (j = 0; j < n; j++)
		{
			array[j] = temp[j];  //将排好顺序的元素赋给array[]数组
		}

		base = base * 10;  //个位变十位变百位变高位,所以乘以10
		
	}
}


int main(void)  //主程序
{
	const int n = 6;  //数组元素的数量
	int array[n];
	cout << "请输入6个整数:" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> array[i];
	}

	cout << endl;  //换行

	RadixSort(array, n);  // 调用RadixSort函数  进行排序

	cout << "由小到大的顺序排列后:" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << "Array" << "[" << i << "]" << " = " << array[i] << endl;
	}

	cout << endl << endl;  //换行

	system("pause");  //调试时,黑窗口不会闪退,一直保持
	return 0;
}

运行结果:

基数排序C++实现 基数排序介绍 基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。 具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 基数排序图文说明 基数排序图文说明 通过基数排序对数组{53, 3, 54 阅读详情

相关推荐

C++ 基数排序的实现实例代码

这篇文章主要介绍了C++ 基数排序的实现实例代码的相关资料,这里附有实例代码,帮助大家学习理解,需要的朋友可以参考下 C++ 基数排序  大家好,今天带来的是自己实现的用C++完成基数排序.在数据结构,算法分析和程序设计的学习过程中,我们经常也无法避免的要学到排序的算法.排序算法是程序设计过程中使用频率极高的算法之一,其输入是一组无序的序列,要求以升序或者降序的方式输出

I_love_blog的博客 2256

C++实现排序算法之基数排序

一、算法思想 基数排序是一种非比较型整数排序算法,其原理是将众多数字按位分隔后进行排序。 实现步骤: 1.将所有待比较的数字(正整数)统一为同一长度,位数不够的数字前面补0; 2.按照从个位,十位,百位······从低到高的顺序进行排序 3.完成从低位到高位的排序后,待排序数字也就完成了排序 具体举例说明: 初始化序列num{57, 123, 564, 32, 0, 56, 169, 5, 23, 11, 100} 将上述序列的数字按照个位数字进行排序,个位数字取值范围0-9,我们可以将其设置为数组用来存储

qq_38307826的博客 7718

C++实现基数排序算法

函数中,我们首先确定数组中的最大值和最大值的位数。然后,我们创建了一个包含10个桶的二维向量,每个桶对应0-9的个位数字。接下来,我们使用两个嵌套的循环,首先将数组中的元素按照位数放入对应的桶中,然后按照桶的顺序将元素取出重新组成数组。它的思想是将待排序的数字按照个位、十位、百位等位值进行排序,从低位到高位依次进行。基数排序的时间复杂度为O(d * (n + k)),其中d是最大值的位数,n是数组的长度,k是每个桶中的元素个数。基数排序是一种稳定的排序算法,适用于位数固定的正整数排序。

DevWizard的博客 507

数据结构-基数排序(C++)

基数排序是和其他的各类排序方式都不同的方式,之前的各类排序,如快速排序,堆排序,冒泡排序等等,都是通过关键字之间的比较和移动记录这两种操作来实现的,而基数排序不需要记录关键字之间的比较。所谓基数排序就是通过关键字排序的思想对单逻辑关键字进行的方法。

chihiro1122的博客 1693

基数排序源代码 C++实现

C实现基数排序,代码简练,清洗易懂,欢迎下载,有问题的地方请优快云上给我留言加以修正,共勉。

ArcMap投影变换避坑指南:为什么你的坐标转换总出错?常见问题解析与解决方案

本文深入解析ArcMap中坐标转换与投影变换的核心区别与常见陷阱。针对坐标转换总出错的问题,从混淆“定义投影”与“投影变换”、栅格数据重采样选择、矢量数据地理变换参数设置等关键环节,提供清晰的避坑指南与实战解决方案,帮助用户确保空间数据的精确匹配。

weixin_29210727的博客 357

基数排序C++实现

基数排序C++实现基数排序C++实现 基数排序 概念见基数排序。 C++实现 #include <iostream> #include <vector> using namespace std; /** * 获取一个数组的最大值对应的十进制位数 */ int getMaxBit(std::vector<int> nums) { int max_num = nums[0], bit = 0; for(int num : nums) max_num = max

Tsavorite的博客 460

Unity URP半透明物体深度排序优化:解决自交叠渲染瑕疵

本文深入探讨了Unity URP管线中半透明物体深度排序的优化方法,重点解决自交叠区域的渲染瑕疵问题。通过双通道渲染、深度预写入、多通道渲染等核心技术,结合实战案例和性能数据,帮助开发者实现高质量的透明效果渲染。

weixin_30879169的博客 419

C++基数排序

目录 一、概述 二、代码 三、程序运行情况 一、概述 1、基本思想(沿袭自桶排序): 从低位开始,对所有数字进行排序。例如第1轮排序后,数字的个位数要有序;第2轮排序后,数字的十位数要有序,如果十位数相同的数,个位数要按照之前的相对顺序摆放;依次类推直至最高位排序完成。过程如下图: 二、代码 C++利用vector实现 /*======================...

幻欢子 1542

CANoe信号波形分析保姆级教程:Graphic窗口从配置到实战避坑

本文详细解析了CANoe的Graphic窗口在信号波形分析中的高效配置与实战应用技巧。从信号显示模式选择、测量光标进阶操作到信号分组策略,提供工程化解决方案,帮助工程师快速定位总线信号异常,提升汽车电子开发与测试效率。

weixin_29279047的博客 269

NPU、CPU和GPU

NPU、CPU和GPU是三种不同类型的处理器,它们各自有不同的设计特点和应用场景。NPU(Neural Processing Unit,神经网络处理单元)是一种专门为加速神经网络计算而设计的处理器。

m0_60697583的博客 1755

c++实现基数排序

代码说明 代码是我亲自码的,调试通过的,代码中有算法思想和详细的注释,一目了然。 项目已经上传到我的github:https://github.com/yisun03/sort 项目中近期会陆续更新十种排序算法的c++实现代码以及其思想。 术语说明 1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。 2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。 3、原地排序:原地

Yi Sun的博客 3627

解析vCard 3.0:提取电子名片中的姓名

N:LastName;FirstName;;;END:VCARD和END:VCARD标记数据块的开始和结束。N字段存储结构化姓名(分号分隔)。FN字段为直接可读的显示名称。其他字段如TELEMAIL等保存联系信息。

qq_45797625的博客 2780

[C++]基数排序的实现

  大家好,今天带来的是自己实现的用C++完成基数排序.在数据结构,算法分析和程序设计的学习过程中,我们经常也无法避免的要学到排序的算法.排序算法是程序设计过程中使用频率极高的算法之一,其输入是一组无序的序列,要求以升序或者降序的方式输出一组有序的序列.对于如二分查找等算法,要求输入是有序的序列,也就是要先排序后查找,由此可见排序算法的重要性.   广为人知的排序算法有冒泡排序,还有选...

bam2332的博客 317

手把手带你死磕ORBSLAM3源代码(一)目录详解

ORB-SLAM3是一种基于特征点的稀疏实时单目SLAM(Simultaneous Localization and Mapping)系统。它是ORB-SLAM系列模型的第三代版本,用于在无人机、机器人和增强现实等领域中进行实时定位和建图。ORB-SLAM3使用了一种特征点提取和描述算法,称为ORB(Oriented FAST and Rotated BRIEF)。该算法能够提取图像中的稳定特征,并将其用于地图建立和相机定位。

anananajiushiwo的博客 2301

PCL 法向量夹角剔除错误匹配点对【2026最新版】

实现了一种简单的基于对应点法线角度的对应关系去除方法。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 41万+

基数排序算法——C++

​基数排序的主要思想是选择多位基数依次进行排序,利用每次排序后还是相对有序,也就是稳定排序性质,依次比较完所有基数后,完成整个数组排序。其中,每次比较基数比如对整数进行排序时可以采用计数排序,因为整数位数有限并且每个位上的数值范围是0-9,所以最适合采用优化后计数排序对每个基数进行排序。 时间复杂度为O(n + m),空间复杂度为O(n + m),其中n为数组个数,m为数组最大值位数。 基数排序跟数组规模有关,假如规模很大的话,不一定比快速排序更优,故需要就具体数据模块进行分析。 一、代码实现分

净无邪博客 3013

DRM遇到的实际问题及领悟(3)

DRM遇到的实际问题及领悟(3)

phmatthaus的专栏 637

基数排序的C++实现

#include <iostream> #include <vector> using namespace std; //传入一个n,返回10的n次方 int my_ten_power(int n) { int power=1; for(int i=0;i<n;i++) power*=10; return power; } //传入一个值num和表示位...

Lemon_Yark的博客 373

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C++排序算法之基数排序

基数排序 基数排序是一种非比较的排序算法,它是以桶排序为基础的,其思想是“多关键字排序”。 基数排序有两种实现方式: (1)最高位优先:即先按最高位排成若干子序列,在对每个子序列按次高位排序。      举例:扑克牌的例子,就是先按花色排成4个子序列,在对每种花色的13张牌进行排序,最终使所有的扑克牌整体有序。 (2)最低位优先:这种方式不必分成子序列,每次排序全体元素都参与

YF_Li123的博客 2008

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基数排序C/C++代码实现

链式基数排序: 分配类排序不需要比较关键字的大小,它 是根据关键字中各位的值,通过对待排序记录进行若干趟 “ 分配 ” 与 “ 收集” 来实现排序的,是一种 借助于多关键字排序的思想对单关键字排序的方法。基数排序(RadixSorting)是典型的分配类排序 算法属性: 时间复杂度为O(n) 空间复杂度为O(n+ rd),(假设每个记录含d个关键字,每个关键字的取值范围为rd个值)。 稳定排序。 基数排序使用条件有严格的要求:需要知道各级关键字的主次关系和各级关键字的取值范围。 代码如下: #inclu

Ycy的博客 4493

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

基数排序的C++实现(解析)

基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。时间复杂度是 O(k·n),其中n是排序元素个数,k是数字位数。——

lslxdx的专栏 2322

基数排序(C++实现)

基数排序 #include <iostream> #include <list> using namespace std; int maxdigit(int data[], int n) { int d = 1; // 计位器: 1 1位数 2 两位数 int p = 10; // 倍数 // 求数组中最高位的的位数 for (int i = 0; i < n; ++i) { while (data[i] >= p) { p *= 10;

I,Pencil 1881

C++实现基数排序

C++实现基数排序: //基数排序 #include using namespace std; void radixsort(int *a,int size) { int d=1;//位数 for(int i=0;i { int p=a[i]; int max=1; while(p/10) { p=p/10; max++; } if(d d=max;

坚持 984

c++之基数排序

#include<iostream> #include<vector> #include<string> using namespace std; int MaxBit(const vector<int> &arr)//获得最大位数 { int len = 1; int max = arr[0]; for (int i = 0; ...

weixin_42579072的博客 285
上一篇: C++ 归并排序
下一篇: C++ 计数排序
dong.x_辛旭东
博客等级 码龄9年 11粉丝 13原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值