【排序算法】 计数排序(非比较排序)详解!了解哈希思想!

news2025/7/19 13:30:32

在这里插入图片描述

🎥 屿小夏 : 个人主页
🔥个人专栏 : 算法—排序篇
🌄 莫道桑榆晚,为霞尚满天!

文章目录

  • 📑前言
  • 🌤️计数排序的概念
    • ☁️什么是计数排序?
    • ☁️计数排序思想
      • ⭐绝对映射
      • ⭐相对映射
  • 🌤️计数排序的实现
    • ☁️实现思路
    • ☁️代码实现
    • ☁️代码解析
  • 🌤️计数排序特性总结
    • ☁️时间复杂度:
    • ☁️空间复杂度
    • ☁️稳定性
    • ☁️适用性限制
    • ☁️不适用于大规模数据
    • ☁️总结
  • 🌤️全篇总结

📑前言

什么是计数排序?计数排序的思想是什么?它是如何实现的?

本文会对计数排序进行由浅入深的探究,让你彻底掌握计数排序!

🌤️计数排序的概念

☁️什么是计数排序?

​ 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。

​ 统计每个元素出现的次数,然后根据元素的大小顺序将它们放入正确的位置。

☁️计数排序思想

计数排序是一种小众的排序,它适合于数据密集的场景,按最大数的数值来开空间。

⭐绝对映射

假设现有一组数据,最大的数据是1000,那么便会开一千个大小的空间,这种属于绝对映射,在极端的场景下,极易造成空间上的浪费,比如现在有5,99,88,1000,8888,452,635,82,777,555,只有10个数但是最大的数是8888因此要开8888大小的空间,剩余的空间全部都浪费了。

⭐相对映射

因此绝大多数情况下,都会使用相对映射。

具体的步骤如下:

  1. 找出待排序数组中的最大值和最小值,并创建一个计数数组,长度为最大值和最小值之差加1。
  2. 遍历待排序数组,统计每个元素出现的次数,并将次数存储在计数数组的相应位置上。
  3. 对计数数组进行累加操作,得到每个元素在排序后数组中的最终位置。
  4. 创建一个与待排序数组长度相同的临时数组,用于存储排序后的结果。
  5. 从后向前遍历待排序数组,根据计数数组中每个元素的值,将元素放入临时数组的相应位置上。
  6. 将临时数组中的元素复制回待排序数组,完成排序。

在这里插入图片描述

🌤️计数排序的实现

☁️实现思路

  1. 找到数组中的最小值和最大值,以确定计数数组的大小。
  2. 然后,根据最小值和最大值计算计数数组的大小,并分配内存空间。
  3. 接下来,将计数数组的所有元素初始化为0。
  4. 然后,遍历原数组,统计每个元素出现的次数,将统计结果保存在计数数组中。
  5. 接着,使用两个循环,将计数数组中的元素按照次数依次放回原数组中。
  6. 最后,释放计数数组的内存空间。

☁️代码实现

//计数排序
void CountSort(int* a, int n)
{
	int min = a[0];
	int max = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] < min)
		{
			min = a[i];
		}
		if (a[i] > max)
		{
			max = a[i];
		}
	}
	int range = max - min + 1;
	int* count = (int*)malloc(sizeof(int) * range);
	if (count == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	memset(count, 0, sizeof(int) * range);
	for (int i = 0; i < n; i++)
	{
		count[a[i] - min]++;
	}
	int j = 0;
	for (int i = 0; i < range; i++)
	{
		while (count[i]--)
		{
			a[j++] = i + min;
		}
	}
}

☁️代码解析

  1. 寻找最小值和最大值: 首先,通过循环遍历输入数组 a,找到数组中的最小值 min 和最大值 max。这是为了确定排序范围。
  2. 确定排序范围: 计算排序范围 range,即 (max - min + 1),这表示需要排序的整数范围。
  3. 创建计数数组: 使用 malloc 函数为计数数组 count 分配内存,该数组的大小是排序范围 range。计数数组用于存储每个整数在输入数组中出现的次数。
  4. 初始化计数数组: 使用 memset 函数将计数数组 count 中的所有元素初始化为0。
  5. 计数: 遍历输入数组 a,对于每个整数 a[i],将其减去 min 的值作为索引,然后在计数数组中对应索引位置的值加1。这一步会统计每个整数在输入数组中出现的次数。
  6. 重构排序数组: 使用两个循环,首先遍历计数数组 count,然后在内部循环中,根据计数数组中的值,将相应数量的整数值还原到原始输入数组 a。这将完成排序过程。

🌤️计数排序特性总结

☁️时间复杂度:

计数排序的时间复杂度为 O(n+k),其中 n 是输入数组的大小,k 是整数的范围。它具有线性时间复杂度的优点,适用于整数排序,特别是当整数范围相对较小且分布均匀时。

☁️空间复杂度

计数排序的空间复杂度取决于整数范围,为 O(k)。因此,它需要额外的空间来存储计数数组,当整数范围较大时可能会占用较多内存。

☁️稳定性

计数排序是一种稳定的排序算法。稳定性意味着具有相同值的元素在排序后仍保持相对顺序不变。在计数排序中,具有相同值的元素会按照它们在输入数组中的顺序被放置在输出数组中。

☁️适用性限制

计数排序仅适用于整数排序,特别是当整数范围相对较小且分布均匀时。它不适用于排序包含负数或浮点数的数组。此外,如果整数范围过大,可能会导致内存占用过多。

☁️不适用于大规模数据

尽管计数排序具有线性时间复杂度的优点,但它对于大规模数据集的排序可能并不理想。当整数范围非常大且分布不均匀时,计数排序的性能可能会受到限制。

☁️总结

计数排序适用于特定范围内的整数排序,并且在这种情况下具有稳定的性能表现。然而,在应用计数排序时,需要仔细考虑整数范围和数据集的分布情况,以确保不会出现内存占用过大或性能下降的情况。

🌤️全篇总结

本章专门对计数排序从概念到实现,进行了细致入微的讲解,期望对你理解掌握计数有所帮助!

看到这里希望给博主留个:👍点赞🌟收藏⭐️关注!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费低代码软件:最佳选型推荐

低代码是什么&#xff1f;他是鉴于0代码和高代码之间的概念&#xff0c;主要强调用户无需专业的代码知识即可完成一个成熟的应用程序的搭建。而市场上众多的低代码软件&#xff0c;如何选择一个合适自身企业的产品呢&#xff1f;小编建议不妨先试试免费低代码软件Zoho Creator。…

栅格及波段融合工具

支持大部分栅格数据的波段融合&#xff0c;可以将不同栅格数据的任意波段融合到一个栅格文件里&#xff0c;可以选择融合的波段。 下载地址&#xff1a; https://download.csdn.net/download/qq_35582643/88490703?spm1001.2014.3001.5503 运行方式&#xff1a; 输入…

万达商业携手蜂鸟视图实现CAD图纸一键转换三维地图

室内三维电子地图在很多行业已经形成了广泛应用&#xff0c;特别是商业地产领域的需求持续增长。然而&#xff0c;应用方一直面临挑战的难题是传统的地图绘制工作的繁重和难以满足时效性。为应对这一难题&#xff0c;在2022年蜂鸟视图推出CAD快速转换工具&#xff0c;能够将主流…

Python和urllib库下载网页内容

首先我们需要导入urllib库&#xff0c;然后使用urllib库的urlopen()函数来打开网页。urlopen()函数的第一个参数是需要下载的网页的URL&#xff0c;第二个参数是服务器的URL和端口。 import urllib.request ​ # 打开网页 url proxy_url response urllib.request.urlopen…

记一次 .NET 某工厂无人车调度系统 线程爆高分析

一&#xff1a;背景 1. 讲故事 前些天有位朋友找到我&#xff0c;说他程序中的线程数爆高&#xff0c;让我帮忙看下怎么回事&#xff0c;这种线程数爆高的情况找问题相对比较容易&#xff0c;就让朋友丢一个dump给我&#xff0c;看看便知。 二&#xff1a;为什么会爆高 1. …

【java学习—十一】泛型(1)

文章目录 1. 为什么要有泛型Generic2. 泛型怎么用2.1. 泛型类2.2. 泛型接口2.3. 泛型方法 3. 泛型通配符3.1. 通配符3.2. 有限制的通配符 1. 为什么要有泛型Generic 泛型&#xff0c;JDK1.5新加入的&#xff0c;解决数据类型的安全性问题&#xff0c;其主要原理是在类声明时通过…

精选10款Python可视化工具,请查收

今天我们会介绍一下10个适用于多个学科的Python数据可视化库&#xff0c;其中有名气很大的也有鲜为人知的。 1、matplotlib matplotlib 是Python可视化程序库的泰斗。经过十几年它仍然是Python使用者最常用的画图库。它的设计和在1980年代被设计的商业化程序语言MATLAB非常接近…

的修工单管理系统好用吗?工单系统应该怎么选?

在当今的数字化时代&#xff0c;企业运营效率的高低往往取决于其内部管理工具的先进性和实用性。工单管理系统作为企业运营中的重要工具&#xff0c;其作用日益凸显。市场上存在许多工单管理系统&#xff0c;但“的修”以其独特的产品差异化和优势&#xff0c;在竞争中独树一帜…

Linux C语言进阶-D3~D4字符串处理函数

求字符串长度函数strlen、字符串拷贝strcpy、字符串连接strcat、字符串比较strcmp 头文件<string.h> 求字符串长度strlen函数 1、计算字符串长度&#xff0c;并且遇到\0结束&#xff0c;返回字符串长度 2、 计算字符串长度&#xff0c;遇到转义字符&#xff0c;\不算在内…

基于ASP.NET MVC + Bootstrap的仓库管理系统

基于ASP.NET MVC Bootstrap的仓库管理系统。源码亲测可用&#xff0c;含有简单的说明文档。 适合单仓库&#xff0c;基本的仓库入库管理&#xff0c;出库管理&#xff0c;盘点&#xff0c;报损&#xff0c;移库&#xff0c;库位等管理&#xff0c;有着可视化图表。 系统采用Bo…

消息的订阅与发布机制

消息的订阅与发布机制 功能&#xff1a;可完成任意组件之间数据的传递&#xff08;同全局事件总线功能一样&#xff09;区别&#xff1a;与全局事件总线相比&#xff0c;消息的订阅和发布机制需要使用第三方库。我用的是pubsub-js库&#xff0c;其他的第三方库也可以使用&#…

如何在崩坏3rd游戏中使用万安单机单窗口软件进行游戏道具收购?

如何在崩坏3rd游戏中使用窗口软件进行游戏道具收购&#xff1f; 首先&#xff0c;定义在崩坏3rd游戏中&#xff0c;使用窗口软件进行游戏道具收购涉及到账户绑定、软件下载、游戏内购买等步骤。 我在玩崩坏3rd游戏时&#xff0c;使用了窗口软件成功完成了游戏道具的收购。 步骤…

【产品体验】OA办公系统

一、演示地址 http://admin.dianshixinxi.com:90/index 二、办公管理功能 1.我的待办&#xff1a;当前登录用户&#xff0c;办理任务 2.通知公告&#xff1a;通知与公告&#xff0c;已发布通知公告会显示在首页 3.自定义表单&#xff1a;自定义表单&#xff0c;托拉拽的形式…

【Python 零基础入门】Numpy 常用函数

【Python 零基础入门】内容补充 3 Numpy 常用函数 概述Numpy 数组创建np.arangenp.linspace 数组操作reshapeflattenconcatenatesplitvstackhstack 数学运算add 相加subtract 相减multiply 相乘divide 相除 通用函数np.sqrt 平方根np.log 对数np.exp 指数np.sin 正弦 概述 Num…

WPS文件恢复怎么做?记得掌握这5个方法!

“我保存在WPS里的部分文件丢失了&#xff0c;大家快帮我想想办法吧&#xff0c;有什么方法可以恢复这些WPS里的文件吗&#xff1f;真的很重要&#xff01;” WPS Office是一款流行的办公套件&#xff0c;给用户在办公和学习方面提供了很多的便利。但在整理文件时&#xff0c;我…

CV计算机视觉每日开源代码Paper with code速览-2023.10.30

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【语义分割】&#xff08;NeurIPS2023&#xff09;SmooSe…

pc通过window.open打开新页面,新页面要使用原来页面的token

原文链接&#xff1a; https://blog.csdn.net/weixin_42342065/article/details/127420783 (以下为本人笔记使用) 对于前端来说&#xff0c;一般在登录获取token之后会把token存入缓存以及放置在Request Headers请求头中&#xff0c;但是使用iframe/window.open/a这三种标签打…

高并发项目部署以及优化手段

文章目录 &#x1f50a;博主介绍&#x1f916;博主的简介&#x1f4e5;博主的目标 &#x1f964;本文内容&#x1f31f; 服务器配置&#x1f34a; 文件系统参数、TCP网络层参数等系统参数&#x1f34a; 修改文件描述符大小 &#x1f31f; SpringBoot的配置&#x1f34a; 1. 配置…

WPS Office 制作下拉两级联动

文章目录 前言WPS Office 制作下拉两级联动1. 准备两级联动数据![在这里插入图片描述](https://img-blog.csdnimg.cn/dc8c21c5f12349aeb467eed266888618.png)2. 设置一级下拉3. 设置二级联动下拉 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xf…

k8s资源对象--pod

创建pod: kubectl get pod cp test_pod_1.yaml nginx_pod.yaml cah 查看详细信息&#xff1a; pod的状态处于pending可能的原因&#xff1a;一个或多个没有运行 由于当前所有节点没有可用节点&#xff08;所有节点资源不足&#xff0c;所有节点&#xff09; 查看所有&…