八大算法排序@计数排序(C语言版本)

目录

  • 计数排序
    • 概念
    • 算法思想
    • 算法步骤
    • 代码实现
    • 时间复杂度
    • 空间复杂度
    • 特性总结

计数排序

概念

  计数排序(Counting Sort)是一种线性时间复杂度的排序算法,适用于排序一定范围内的整数数组。它利用了输入序列的数值范围来确定每个元素在输出序列中的位置。




算法思想

  主要思路是找出待排序数组的最大值和最小值,确认原数组的范围range,然后申请一有range个空间大小的数组并且数组内各个元素初始化为0,称之为计数数组。将原数组中的数映射到计数数组中,最终通过计数数组中的元素的数值,判断映射过来的数出现了多少次,以及原数组中的顺序情况。我们拿实现升序的计数排序来进行模拟演变。
如下,是初始状态图:

在这里插入图片描述

其中, arr1 = { 6 , 4 , 3 , 9 , 2 ,1 , 5 , 7 , 8 }是待排序的数组,变量maxi 和 mini 分别用来存放数组中最大的元素和最小的元素的下标。range是数组arr1的范围大小。



第一步:

第一步

找出原数组中的最大值和最小值的下标,通过下标算出原数组数据的范围range。再使用malloc函数,申请range个空间的计数数组retArr[range];



第二步:

通过迭代循环,将原数组一个个的映射到计数数组中,如下:

映射过程
需要注意的问题有:
1、偏移量的问题。映射关系要减去原数组的最小值,也是计数数组下标的问题。比如有个数组范围是10,但是最小值是100,最大值是109。比如数组中有个数105,要将它映射到计数数组中,直接将105映射到计数数组的话,那么计数数组就得开到有106个空间,这就造成了浪费。将105减去最小值100,这样映射到计数数组中的下标就是5,一样能够解决问题,这就避免了空间的浪费。

2、初始化问题。malloc动态申请的空间,没有初始化时数组内的各个元素都是随机值,而计数排序的关键就是对原数组中数据的大小、出现次数进行统计。所以对于申请开辟出来的计数数组中的初始值,我们要初始化好,一般都初始化为0,方便。也可以初始化为其他数,但是后面要消掉这个偏移量。

3、内存泄露问题。动态申请的空间,最后时得主动释放空间,要不然会造成内存泄露。

4、类型问题。计数排序只适用于整形数据的排序。字符类型要比较类型也不是不可以,但是要考虑ASCII码值的转换,比如字符 ‘1’ - 字符 ‘0’ 就等于整型数据1啦。但是像字符串、浮点型则不适用,因为字符串的比较大小的规则、浮点型的精确度问题,都不适用计数排序来排序。字符串和浮点型可以考虑使用其他的排序方法,如快速排序和归并排序等。



最后,我们得到了一个将原数组全部映射完到计数数组的,一个统计数组retArr。我们再通过计数数组retArr,复原出原数组,同时也就实现了对原数组的排序。
最终

以上,便是对计数排序的大体图文介绍,下面用文字表述以上思路。




算法步骤

确定范围: 找出待排序数组中的最大值和最小值,确定数值范围。
计数:     创建一个辅助数组(计数数组),长度为数值范围的大小,用于统计原始数组中每个元素出现的次数。
累加计数: 对计数数组进行累加操作,使得每个位置上的值表示小于或等于该位置值的元素个数。
输出:     根据原始数组的值在计数数组中找到对应的位置,将元素放置到输出数组中。


接下来,就用代码来实现吧。




代码实现

// 时间复杂度:O(N+range)
// 空间复杂度:O(range)
// 只适用于整形,如果是浮点数或者字符串排序,还得用比较排序
void CountSort(int* a, int n)
{int max = a[0];int 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;// 申请开辟range个大小的空间int* retArr = (int*)malloc(sizeof(int) * range);memset(retArr, 0, sizeof(int) * range);	// 注意,要对该空间初始化为0,才能对数组a进行计数!!!!,否则数组自身随机值会导致计数的失败// 判断申请空间是否成功if (retArr == NULL){printf("空间扩容失败\r\n");exit(-1);}// 将原数组映射到计数数组中,进行统计for (int i = 0; i < n; i++){retArr[a[i] - min] += 1;}// 通过计数数组复原原数组的元素,同时完成排序的效果int index = 0;for (int j = 0; j < range; j++){while (retArr[j]--){a[index++] = j + min;}}free(retArr);
}

以上便是计数排序的代码实现,具体可以看着代码一点点意会,此处不做多加讲解。需要注意的便是下标的迭代问题了。




时间复杂度

O(N+range),其中N是数组元素个数,range是辅助计数数组的范围。
当N>>range时,时间复杂度为O(N);
当range>>N时,时间复杂度为O(range);
当N和range相近时,时间复杂度为O(N)或O(range)。

注:“ >> ” 是远大于的意思
算计数排序时间复杂度的思想:
首先要遍历一遍原数组找出最大、最小值,需要N步;
其次需要将计数数组依次映射复原原数组,需要range步。至于比如说有的计数数组的元素值为3,那么该元素得迭代3次,对于常数次的动作,计算时间复杂度时不计入。



空间复杂度

O(range)

计数排序得向内存申请range个空间。所以空间复杂度为O(range)

注:“ range ” 是原数组的数值范围




特性总结

1、只适合整形数据的排序,字符、字符串或浮点型等都不适用。
2、时间复杂度:O(N+range)
3、空间复杂度:O(range)
4、稳定性:稳定

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

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

相关文章

【AIGC摄影构图prompt】与重不同的绘制效果,解构主义+优美连拍提示效果

提取关键词构图&#xff1a; 激进解构主义 在prompt中&#xff0c;激进解构主义的画面效果可能是一种颠覆传统和权威的视觉呈现。这种画面可能以一种极端或激烈的方式表达对现有社会结构和观念体系的批判和质疑。 具体来说&#xff0c;这种画面效果可能包括&#xff1a; 破…

德思特方案 | 易用、高效、可靠!高精度组合定位系统P-Box测试解决方案

来源&#xff1a;德思特测量测试 德思特方案 | 易用、高效、可靠&#xff01;高精度组合定位系统P-Box测试解决方案 原文链接&#xff1a;https://mp.weixin.qq.com/s/VLlCAT78jQWcc8DeWlRJyw 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 简介 TCU&#xff08;Te…

k8s的陈述式管理

k8s的陈述式管理&#xff1a; 所谓的陈述式管离也就是命令行工具 优点&#xff1a;90%以上都可以满足 对资源的增删查比较方便&#xff0c;对改不是很友好 缺点&#xff1a;命令比较冗长&#xff0c;复杂&#xff0c;难记 声明式&#xff1a; k8s当中的YAML文件来实现资源管…

开源MIT协议软件 - ChatGPT Admin Web

ChatGPT Admin Web 在团队和组织内共享使用人工智能的一站式解决方案。 ​编辑 ​编辑 ​编辑 CAW 是一个自托管网络应用程序&#xff0c;提供开箱即用的用户管理&#xff0c;包括后台界面以及可配置的支付计划和相关支付界面。 GitHub Sponsor / 爱发电 功能 Features …

职场干货!谈谈AI时代必备的产品设计技能

生成式AI技术在2023年的快速进步&#xff0c;让各行各业都加速进入了AI时代。作为科技圈活跃了一整年的绝对爆点&#xff0c;AI似乎真的越来越靠谱了&#xff0c;“所有产品都值得用AI重做一遍”的理念正在走入现实。在这篇文章中&#xff0c;笔者将探讨产品设计行业的从业者们…

瞬态抑制二极管(TVS)的注意事项与布局布线?|深圳比创达电子

一、瞬态抑制二极管(TVS)的注意事项 工作电压/反向截止电压&#xff08;VRVRWM&#xff09;此参数不需要降额&#xff0c;保证大于等于工作电路最大工作电压即可&#xff0c;越接近越好。该参数为TVS的固有参数。VBR是TVS固有参数&#xff0c;与外界冲击波形无关。 被保护器件…

论el-menu自定义样式

最终效果: 原始效果: 相关代码: <!-- 菜单 --><div class"button-manage-right"><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"><el-menu-itemv-fo…

转发的原理及代码演示

一、转发的概念 一个Web组件&#xff08;Servlet/JSP&#xff09;将未完成的处理通过容器转交给另外一个Web组件继续处理&#xff0c;转发 的各个组件会共享Request和Response对象。 二、代码演示 1、编写转发界面 创建空工程&#xff0c;在工程中创建javaEE模块 配置中设置…

前端开发_JavaScript基础

JavaScript介绍 JS是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;实现人机交互效果 作用&#xff1a; 网页特效 (监听用户的一些行为让网页作出对应的反馈) 表单验证 (针对表单数据的合法性进行判断) 数据交互 (获取后台的数据, 渲染到前端) 服…

优化模型:matlab二次规划

1.二次规划 1.1 二次规划的定义 若某非线性规划的目标函数为自变量 x x x的二次函数&#xff0c;且约束条件全是线性的&#xff0c;则称这种规划模型为二次规划。 1.2 二次规划的数学模型 min ⁡ 1 2 x T H x f T x \min \frac{1}{2}\boldsymbol{x}^{\boldsymbol{T}}\bolds…

mysql: 2006, ‘MySQL server has gone away‘

一、错误问题 这个问题是在迁移数据库、备份还原或数据导入时报错&#xff1a;2006, ‘MySQL server has gone away‘ 二、出现原因 sql操作的时间过长&#xff0c;或者是传送的数据太大(例如使用insert ... values的语句过长&#xff0c; 这种情况可以通过修改max_allowed_pac…

部署上传漏洞的靶场环境upload-labs

1、工具介绍 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关&#xff0c;每一关都包含着不同上传方式。 upload-labs靶场开源地址&#xff1a;&#xff1a;https://…

CMake入门教程【基础篇】打印(message)

文章目录 1. 基本用法示例 2. 打印变量的值示例 3. 打印列表的值示例 4. 打印生成器表达式的值示例 5.总结 #mermaid-svg-pXC2tr41PvHonKJa {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-pXC2tr41PvHonKJa .error-…

页面间动画之放大缩小视图

目录 1、Exchange类型的共享元素转场 2、Static类型的共享元素转场 3、场景示例 在不同页面间&#xff0c;有使用相同的元素&#xff08;例如同一幅图&#xff09;的场景&#xff0c;可以使用共享元素转场动画衔接。为了突出不同页面间相同元素的关联性&#xff0c;可为它们…

C语言——操作符

一、算数操作符 1、(加操作符) 用于将两个数相加&#xff0c;例&#xff1a;3 3结果为6 2、-(减操作符) 用于将两个数相减&#xff0c;例&#xff1a;3 - 3结果为0 3、*(乘操作符) 用于将两个数相乘&#xff0c;例&#xff1a;3 * 3结果为9 4、/(除操作符) 用于将两个…

Cesium在2d模式下Billboard位置显示不正确的解决方法

Billboard在Cesium 3d模式下位置显示正确&#xff0c;但在2d模式下位置显示不正确&#xff0c;刷新不及时。 解决办法&#xff1a; 不要设置height和heightReferencen&#xff0c;因为2d模式没有高程。

计算机毕业设计 SpringBoot的乡村养老服务管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

南昌找工作用什么APP或者招聘网站

南昌找工作用吉鹿力招聘网 通过吉鹿力招聘网&#xff0c;可以随时查看最新职位&#xff0c;跟踪简历投递动态&#xff0c;与正在进行招聘的CEO、部门负责人、HR在线沟通&#xff0c;查看其他候选人面试该职位后对面试官、公司环境的面试评价等&#xff0c;为求职者提供参考。 …

HCIA-Datacom题库(自己整理)——ACL多选

1.基于ACL规则,ACL可以划分为以下哪些类? 基本ACL 二层ACL 用户ACL 高级ACL 2.ACL分类有哪些? 基本ACL 高级ACL 二层ACL 用户自定义ACL 3.路由器A的G0/0/1接口配置信息如图,下列说法正确的有? 本接口不会转发收到的FTP报文 本接口可以和其它路由器建立OSPF的邻居…

javafx

JavaFX JavaFX简介 JavaFX是一个用于创建富客户端应用程序的图形用户界面&#xff08;GUI&#xff09;框架。它是Java平台的一部分&#xff0c;从Java 8开始成为Java的标准库。 JavaFX提供了丰富的图形和多媒体功能&#xff0c;使开发人员能够创建具有吸引力和交互性的应用程…