发布时间:2026/9/6 5:47:13
数据结构:非比较排序:计数排序 前面我们介绍的冒泡、选择、插入、归并、快排等排序算法本质上都属于比较排序——它们通过元素之间的两两比较来决定先后顺序。本篇我将带大家认识一种另辟蹊径的非比较排序算法——计数排序(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/9/6 5:47:13

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

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

2026/9/6 5:47:13

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

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

2026/9/6 5:47:13

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

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

2026/9/6 6:42:15

Manus恢复独立运营背后:AI Agent技术架构与工程化实践全解析

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

2026/9/6 6:42:15

DeepSeek能不能直接写技术标目录?先拆点再润色

直接结论: DeepSeek 能把已有条目改得像标题,不能替你读完整份招标文件、逐条挂章、拦住孤儿点。「DeepSeek写标书」稳的用法是:先拆点定目录,再把单章拿去润色。一句话生成 8 万字终稿不可靠。须人工审核,不保证中标。…

2026/9/6 6:42:15

Docker 项目部署

一、基本介绍项目说明定义将应用程序及其依赖环境打包到轻量级、可移植的容器中优势开销小、启动快、环境一致本质操作系统层虚拟化,共享宿主机内核二、核心概念概念说明镜像(Image)类、模板,包含程序环境容器(Contain…

2026/9/6 6:42:15

拼多多百货新店越做越废?8成新手栽在这6个低级错误上

做拼多多百货一件代发的人,最常见的状态是这样的:每天睁眼就上新,上新完改标题,改完标题刷后台,一整天忙得脚不沾地,结果月末一看——没流量、没单量,偶尔爆几单还是亏的。于是开始怀疑&#xf…

2026/9/6 6:37:15

基于Spring Boot的学生实习综合服务平台设计与实现

收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/5 2:45:13

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/5 2:46:50

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…