数据结构:非比较排序:计数排序

发布时间:2026/10/29 9:48:37

数据结构:非比较排序:计数排序 前面我们介绍的冒泡、选择、插入、归并、快排等排序算法本质上都属于比较排序——它们通过元素之间的两两比较来决定先后顺序。本篇我将带大家认识一种另辟蹊径的非比较排序算法——计数排序(Counting Sort)它不靠比较而是借助数组下标直接定位元素位置在特定场景下能达到线性时间复杂度。计数排序计数原理又称为鸽巢原理, 是对哈希直接定址法的变形应用. 操作步骤如下:统计相同元素出现次数根据统计的结果将序列回收到原来的序列中思路比如说有以下数组:我们统计每个元素出现的次数, 并将出现次数作为数据放到相应下标中.我们可以看到, 2出现了两次, 所以把2放在下标为2的地方, 3出现了两次, 把3放到下标为3的位置, 4出现了一次, 把1放到下标为4的位置, 6出现了三次, 把3放到下标6的位置, 而其他数字出现次数为0, 所以都放0.也就是说, 我们的数据变成了数组下标, 而相同数据出现次数变成了数据.我们再遍历新数组, 将它还原成一个有序数组.数据为0则往下遍历到下标为2的地方数据不为0则把下标还原为数据放回原数组中数据自减直到为0再去遍历下一个数据并把下标还原回来。思路很简单也可以说是间接利用了数组下标本来就是有序的这一特性很轻松地就把数组排序好了。但是存在一些场景问题。比如说我的数据是{102,103,101,102,103}。数据都比较大且分布集中开辟104个整型空间显然不合理其中101个空间数据都为0白白浪费掉了。我们可以先遍历一遍原数组找到最小值min和最大值max。我们实际存放数据的数组下标就是min到max范围之间我们只需要开辟max-min1个空间就好了将这块空间命名为count。我们如何放呢遍历一遍原数组用数据减去min得到下标让count数组中相应下标中的数据也就是统计原数据出现次数。统计完成后我们再还原回数组就好了。因为我们的下标是原数据减min得到的所以我们还原回去要把min加上。这样就排序好了。代码实现思路很简单我们来实现一下代码先遍历一遍原数组得到最大值和最小值。然后开辟大小为 max - min 1 的空间.这里不用 calloc 函数, 先用 malloc 函数然后用 memset 函数将 count 数组中的数据全设置为 0 也是可以的.然后我们遍历一遍数组, 数据减 min 等于 count 数组中哪个下标, 哪个下标数据就, 也就是 count[arr[i] - min]统计完之后我们把数据还原回数组. 需要遍历一遍 count 数组.代码就完成了.我们简单测试一下:结果符合预期代码没什么问题。时间复杂度可以发现计数排序时间效率很高虽然有嵌套循环但实际上时间复杂度为O(n)。但对于最大值和最小值相差很大的情况无可避免地会浪费掉大量空间所以该排序的适用场景也很有限。
延伸阅读

更多相关文章

2026/10/24 4:55:04

关店前最后一晚,我把验证码全部过了一遍

关店前最后一晚,我把验证码全部过了一遍 一个关店卖家的告别: 「决定关店那天,我把店铺里最后的链接都下架了。下架也弹验证,我一个个过,过得很平静。旁边老婆问:都要关了还这么认真干嘛?我说&…

2026/10/26 12:07:59

数据库工程:索引策略落地避坑实战指南‌

数据库工程:索引策略落地避坑实战指南‌ 2026年4月安徽合肥轨道交通3号线南延线的运维管理系统,在早高峰运维数据上报时段突然出现了大面积的接口超时,全线12个站点的运维人员上报完巡检数据之后,系统提交按钮转了半分钟都没有反应…

2026/10/24 4:55:11

网络原理:初识网络的一些基本概念

IP地址网络通信的本质是计算机之间数据的传输。网络里有很多主机,因此需要知道数据从哪个主机发出,哪个主机接收,所以需要IP地址定位主机。IP地址也可以标识网络中的设备,如路由器。格式:32位二进制,一般分…

2026/10/29 9:44:41

Android反编译工具链实战:APK逆向工程工作台搭建与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 9:44:41

TPS259483AYWPR与TM4C129LNCZAD工业电源协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 9:44:41

FPGA 与 CPU 的本质区别:从 LUT、CLB 到 DSP 的底层逻辑解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 9:44:41

Absolute Database v7.90:轻量级共享内存嵌入式数据框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 9:39:32

工业级电源健康管理系统设计:eFuse+MCU协同架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑