【数据结构】八大排序之计数排序算法

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


目录

 一.计数排序简介及思想

二.计数排序代码实现 

三.计数排序复杂度分析

📌时间复杂度

📌空间复杂度

结语


 一.计数排序简介及思想

计数排序(Counting Sort)又称为鸽巢原理,是对哈希直接定址法的变形应用.

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

算法动图演示如下:

计数排序的实现思路:

  1. 统计每个数据出现的次数
  2. 按序输出

虽然计数排序实现思路比较简单,但我们还是有一些细节需要注意:

绝对映射和相对映射:

  • 绝对映射:如下图,数据的数值和数组下标是一一对应的,这种计数方式叫做绝对映射
  • 绝对映射的缺点:开辟数组占用空间大,不能够排负数
  • 相对映射:如下图,数据在数组中是按照数值的相对大小来映射的,这种计数方式叫做相对映射.相对映射较好的解决了绝对映射的缺点,但当遇到待排数据分布较为分散且跨度较大时,就不太适合使用计数排序来进行排序了.

二.计数排序代码实现 

算法实现步骤:(以升序为例)

  1. 遍历待排数组,找出数组中的最大值max和最小值min.
  2. 开辟大小为max-min+1大小的数组用以计数.
  3. 遍历数组计数.
  4. 将计数数组中记录的数据恢复到原数组中.

综上,计数排序的代码实现如下:

//计数排序
void CountSort(int* a, int n)
{
	int max = a[0], min = a[0];
	for (int i = 1; i < n; i++)
	{
		if (a[i] > max)
		{
			max = a[i];
		}
		if (a[i] < min)
		{
			min = a[i];
		}
	}

	int range = max - min + 1;

	int* countA = (int*)calloc(sizeof(int) , range);
	if (countA == NULL)
	{
		perror("calloc fail\n");
		return;
	}

	//计数
	for (int i = 0; i < n; i++)
	{
		countA[a[i] - min]++;//映射的下标++就行
	}

	//排序
	int j = 0;
	for (int i = 0; i < range; i++)
	{
		while (countA[i]--)
		{
			a[j++] = i + min;
		}
	}

	free(countA);
}

三.计数排序复杂度分析

📌时间复杂度

计数排序的时间复杂度主要取决于两部分,一是前期遍历数组找出最大值和最小值,这里的时间复杂度为n,二是遍历数组计数,这里的时间复杂度还是n,三是遍历计数数组排序,这里的时间复杂度为range(即max-min),因此我们通常认为,计数排序的时间复杂度为O(n+range);当range接近n时,我们其实可以认为计数排序的时间复杂度为O(n).

📌空间复杂度

计数排序的空间复杂度主要取决于动态开辟的计数数组的大小,即range,因此计数排序的空间复杂度为O(range).


结语

 希望这篇计数排序算法详解能对大家有所帮助,欢迎大佬们留言或私信与我交流.

有关更多排序相关的知识可以移步:

【数据结构】八大排序算法​​​icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135038495?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135038495%22%2C%22source%22%3A%22weixin_72357342%22%7D&fromshare=blogdetail

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】八大排序之冒泡排序算法

【数据结构】八大排序之希尔排序算法

【数据结构】八大排序之直接插入排序算法

【数据结构】八大排序之简单选择排序

【数据结构】八大排序之堆排序算法

【数据结构】八大排序之快速排序算法

【数据结构】八大排序算法之归并排序算法

【数据结构】八大排序之计数排序算法


数据结构排序算法篇思维导图:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318889.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一个月带你手撕LLM理论与实践,并获得面试or学术指导!

大家好&#xff0c;我是zenRRan&#xff0c;是本号的小号主。 从该公众号的名字就能看出&#xff0c;运营已经好多年了&#xff0c;这些年当中直接或间接帮助很多同学从NLP入门到进阶&#xff0c;理论到实践&#xff0c;学校到企业&#xff0c;本科到硕士甚至博士。 每天习惯性…

【K12】Python写分类电阻问题的求解思路解析

分压电阻类电路问题python程序写法 一个灯泡的电阻是20Ω&#xff0c;正常工作的电压是8V&#xff0c;正常工作时通过它的电流是______A。现在把这个灯泡接到电压是9V的电源上&#xff0c;要使它正常工作&#xff0c;需要给它______联一个阻值为______的分压电阻。 解决思想 …

深度学习基本介绍-李沐

目录 AI分类&#xff1a;模型分类&#xff1a;广告案例&#xff1a; bilibili视频链接&#xff1a;https://www.bilibili.com/video/BV1J54y187f9/?p2&spm_id_frompageDriver&vd_sourcee6a6e7fec41c59c846c142eb5ef1da0b AI分类&#xff1a; 模型分类&#xff1a; 图…

初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(3)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

《现代C++语言核心特性解析》笔记草稿

仅供学习记录之用&#xff0c;谢绝转发 第1章 新基础类型&#xff08;C11&#xff5e;C20&#xff09; 1.1 整数类型long long 更多笔记 “在C中应该尽量少使用宏&#xff0c;用模板取而代之是明智的选择。C标准中对标准库头文件做了扩展&#xff0c;特化了long long和unsi…

【AIGC】Controlnet:基于扩散模型的文生图的可控性

前言 controlnet可以让stable diffusion的生图变得可控。 文章连接&#xff1a;https://arxiv.org/pdf/2302.05543.pdf 摘要 冻结了stable diffusion的预训练模型并重用它的预训练编码层神经网络结构与零初始化卷积层连接&#xff0c;从零开始逐渐增加参数&#xff0c;并确…

python入门,数据容器:set集合

set最大的特点就是不支持重复元素&#xff0c;可以进行元素的去重处理&#xff0c;但不有序&#xff0c;不保证元素顺序正确 所以就不能使用下标索引的访问 1.集合的定义 集合的定义使用的是大括号{ } 对ok这个字符串进行了去重 2.add添加新元素 3.remove移除元素 4.pop随机…

鸿蒙Harmony--AppStorage--应用全局的UI状态存储详解

无所求必满载而归&#xff0c;当你降低期待&#xff0c;降低欲望&#xff0c;往往会得到比较好的结果&#xff0c;把行动交给现在&#xff0c;用心甘情愿的态度&#xff0c;过随遇而安的生活&#xff0c;无论结果如何&#xff0c;都是一场惊喜的获得! 目录 一&#xff0c;定义 …

浅析Linux进程地址空间

前言 现代处理器基本都支持虚拟内存管理&#xff0c;在开启虚存管理时&#xff0c;程序只能访问到虚拟地址&#xff0c;处理器的内存管理单元&#xff08;MMU&#xff09;会自动完成虚拟地址到物理地址的转换。基于虚拟内存机制&#xff0c;操作系统可以为每个运行中的进程创建…

DHCP中继【新华三】

理论【DHCP服务器可以对其直连的网段中的pc&#xff0c;分配其IP地址等服务&#xff0c;但是&#xff0c;对于跨网段进行分配IP地址&#xff0c;需要中间有DHCP中继进行传达&#xff0c;由DHCP中继指定DHCP服务器的位置&#xff0c;可以很好的对其跨网段分配IP地址起到指引的作…

如何激活数据要素价值

文章目录 前言一、数据作为生产要素的背景二、数据作为新型生产要素&#xff0c;是价值创造的重要源泉&#xff08;一&#xff09;生产要素是经济活动中的基本要素&#xff08;二&#xff09;激活数据要素价值&#xff0c;要从理论上认识数据要素的基本特征&#xff08;三&…

爬虫—中信证券资管产品抓取

爬虫—中信证券资管产品抓取 中信证券资管产品板块网址&#xff1a;http://www.cs.ecitic.com/newsite/cpzx/jrcpxxgs/zgcp/ 页面截图如下&#xff1a; 目标&#xff1a;抓取上图中红框内的所有资产信息 按F12进入开发者工具模式&#xff0c;在Elements板块下&#xff0c;在…

大数据StarRocks(七):数据表创建

1. 基本概念 1.1 Row & Column 一张表包括行&#xff08;Row&#xff09;和列&#xff08;Column&#xff09;。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。 ⚫ 在默认的数据模型中&#xff0c;Column 只分为排序列和非排序列。存储引擎会按照排序列对…

Flask 小程序菜品搜索

mina/pages/food/index.wxml <!--index.wxml--> <!--1px 750/320 2.34rpx;--> <view class"container"><!--轮播图--><view class"swiper-container"><swiper class"swiper_box" autoplay"{{autoplay}…

中仕公考:2024年上半年中小学教师资格考试(笔试)报名已开始

2024年上半年中小学教师资格考试(笔试)报名工作于1月12日开始&#xff0c;此次笔试在31个省(自治区、直辖市)举办&#xff0c;各省(自治区、直辖市)的报名公告将陆续上网。 个别地区报名截止时间有所差异&#xff0c;上海1月13日报名截止&#xff0c;浙江、天津、河南1月14日截…

Grounding DINO:开放集目标检测,将基于Transformer的检测器DINO与真值预训练相结合

文章目录 背景知识补充CLIP (Contrastive Language-Image Pre-training)&#xff1a;打破文字和图像之间的壁垒DINO(Data-INterpolating Neural Network)&#xff1a;视觉 Transformer 的自监督学习Stable Diffusion&#xff1a;从文本描述中生成详细的图像Open-set Detector开…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《与新能源互补和独立参加多级市场的抽蓄电站容量分配策略》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到抽蓄电站在能源系统中的角色&#xff0c;特别是在多级市场中的参与&#xff0c;并强调了新能源的互补性以及抽蓄电站的独立性。下面我将…

java swing UI第三方设计器JFormDesiner和FlatLaf UI

安装JFormDesiner 官网&#xff1a;https://www.formdev.com/ 先去IDEA的插件市场安装吧 JFormDesiner是非开源&#xff0c;且付费的插件&#xff0c;可以自己去找找不付费的使用方法。在swing可视化设计UI非常高效快捷&#xff0c;初学者可能需要一定时间探索&#xff0c;熟…

最左前缀法则

概念 最左前缀法则是针对于复合索引而言的&#xff0c;也就是说一个索引有多个字段那么索引的查询从最左列开始&#xff0c;并且不跳过索引的列&#xff0c;如果跳过索引中的某一列&#xff0c;那么&#xff0c;会导致索引部分失效(跳过列之后的索引失效)如果出现了范围查询(&…

学习redis有效期和数据类型

1、安装redis和连接redis 参考&#xff1a;ubuntu安装单个redis服务_ubuntu redis单机版安装-CSDN博客 连接redis&#xff1a;redis-cli.exe -h localhost -p 6379 -a 123456 2、Redis数据类型 以下操作我们在图形化界面演示。 2.1、五种常用数据类型介绍 Redis存储的是key…