当前位置: 首页 > article >正文

计数排序:非比较排序的典型代表

在计算机科学中排序算法是基础且重要的内容。我们熟知的快速排序、归并排序等都是基于比较的排序算法它们的时间复杂度下限为O(nlogn)。然而当数据具有某些特殊性质时我们可以利用非比较排序算法突破这一限制计数排序Counting Sort就是其中一种典型的非比较排序算法。本文将深入探讨计数排序的原理、实现、优缺点以及适用场景。计数排序的基本思想计数排序的核心思想是利用待排序元素的取值范围有限这一特性通过统计每个元素出现的次数然后根据统计结果将元素放回正确的位置从而实现排序。它不是通过比较元素大小来确定顺序而是通过对元素计数的操作来完成排序因此属于非比较排序。计数排序的步骤统计频率遍历待排序数组统计每个元素出现的次数存入一个计数数组中。计数数组的下标对应待排序元素的取值计数数组的值表示该元素出现的次数。计算前缀和对计数数组进行遍历计算每个位置的前缀和。这一步的目的是确定每个元素在排序后数组中的最终位置。反向填充数组再次遍历待排序数组根据计数数组中的前缀和信息将元素放到排序后数组的相应位置同时更新计数数组中对应元素的出现次数。计数排序的实现代码以升序排序为例以下是使用Python实现的计数排序代码python1def counting_sort(arr): 2 if not arr: 3 return arr 4 5 # 找到数组中的最大值确定计数数组的大小 6 max_val max(arr) 7 # 初始化计数数组初始值为0 8 count [0] * (max_val 1) 9 10 # 统计每个元素出现的次数 11 for num in arr: 12 count[num] 1 13 14 # 计算前缀和确定每个元素的最终位置 15 for i in range(1, len(count)): 16 count[i] count[i - 1] 17 18 # 初始化排序后的数组 19 sorted_arr [0] * len(arr) 20 # 反向填充排序后的数组 21 for num in reversed(arr): 22 sorted_arr[count[num] - 1] num 23 count[num] - 1 24 25 return sorted_arr 26代码解释找到最大值首先遍历待排序数组arr找到其中的最大值max_val以此确定计数数组count的大小为max_val 1。统计频率再次遍历arr对于每个元素num将count[num]的值加1统计每个元素出现的次数。计算前缀和通过遍历count数组计算每个位置的前缀和使得count[i]表示小于等于i的元素个数。反向填充数组初始化一个与arr大小相同的sorted_arr数组。然后反向遍历arr根据count[num]的值确定num在sorted_arr中的位置将其放入相应位置后将count[num]减1以便后续相同元素的处理。计数排序的时间复杂度和空间复杂度时间复杂度统计频率需要遍历待排序数组arr一次时间复杂度为O(n)其中n是arr的长度。计算前缀和遍历计数数组count一次时间复杂度为O(k)其中k是count数组的长度即待排序元素的最大值加1。反向填充数组再次遍历待排序数组arr一次时间复杂度为O(n)。综合以上三个步骤计数排序的总时间复杂度为O(n k)。当k O(n)时计数排序的时间复杂度为O(n)优于基于比较的排序算法的下限O(nlogn)。空间复杂度计数排序需要额外的计数数组count和排序后的数组sorted_arr因此空间复杂度为O(n k)。计数排序的优缺点优点高效当待排序元素的取值范围较小即k O(n)时计数排序的时间复杂度为O(n)比基于比较的排序算法更高效。稳定计数排序是一种稳定的排序算法即相等元素的相对顺序在排序前后保持不变。这在需要保持原始顺序的场景中非常重要。缺点适用范围有限计数排序只适用于整数排序且要求待排序元素的取值范围不能太大。如果取值范围过大会导致计数数组过大占用大量内存空间降低算法效率。只能用于非负整数排序常规实现上述代码实现的是对非负整数的排序。如果要对负数进行排序需要对代码进行适当修改例如通过偏移量将负数映射到非负区间。计数排序的适用场景计数排序适用于以下场景待排序元素为整数且取值范围较小。例如对学生的成绩通常在0 - 100之间进行排序。需要稳定排序的场景。例如在对多个字段进行排序时先按一个字段排序再按另一个字段排序且要求第一个字段的排序结果在第二个字段排序时保持不变。计数排序的扩展应用计数排序的思想可以扩展到其他排序算法中例如基数排序Radix Sort和桶排序Bucket Sort。基数排序是按照低位先排序然后收集再按照高位排序然后再收集依次类推直到最高位。桶排序则是将数组分到有限数量的桶中每个桶再分别排序可以使用其他排序算法最后将各个桶中的元素有序地合并起来。这两种排序算法都利用了计数排序的思想适用于不同特点的数据排序。总结计数排序作为一种非比较排序算法以其高效和稳定的特点在特定场景下具有很大的优势。虽然它的适用范围有限但在处理整数且取值范围较小的数据时能够发挥出比基于比较的排序算法更好的性能。了解计数排序的原理和实现有助于我们在实际应用中选择合适的排序算法提高程序的效率。希望本文的介绍能让你对计数排序有更深入的理解和认识。

相关文章:

计数排序:非比较排序的典型代表

在计算机科学中,排序算法是基础且重要的内容。我们熟知的快速排序、归并排序等都是基于比较的排序算法,它们的时间复杂度下限为O(nlogn)。然而,当数据具有某些特殊性质时,我们可以利用非比较排序算法突破这一限制,计数…...

基于SpringBoot的社区生活服务平台

一、系统目标 基于 SpringBoot 的社区生活服务平台,旨在解决社区居民生活服务需求分散、获取信息不便、邻里互动不足、物业与居民沟通不畅等问题。通过构建 “便民服务 - 邻里互动 - 物业协同 - 商圈联动” 的全流程数字化平台,实现社区生活服务的集中化…...

一维线性插值算法C++详细实现

算法概述&#xff1a;算法实现&#xff1a;下面提供一套健壮的一维线性插值 C 实现&#xff0c;重点考虑了数据预处理、边界处理、重复点合并及浮点容差等鲁棒性细节。#include <vector> #include <algorithm> #include <stdexcept> #include <cmath> …...

能看、能玩、还能带走!ANTINSKY全系列3D打印材料亮相2026 TCT亚洲展

ANTINSKY蚁在云端&#xff0c;打造一站式3D打印采购新体验。2026年3月17日-19日&#xff0c;第12届TCT亚洲展将在上海国家会展中心举行。作为亚太地区增材制造行业的重要展会&#xff0c;本届展会预计将汇聚550余家展商。据资源库了解&#xff0c;ANTINSKY&#xff08;蚁在云端…...

前端转型全栈工程师超详细指南:零基础入门到实战落地,攻克转型难点

&#x1f3f7;️ 标签&#xff1a;全栈开发、前端转型、Node.js、全栈学习路线、后端入门、实战项目 &#x1f4cc; 摘要&#xff1a;本文针对前端开发者转型全栈工程师的痛点&#xff0c;详细拆解转型前提、分阶段学习路径、核心技术栈、实操项目、难点攻克方案&#xff0c;给…...

微电网的功率流计算:基础方法与影响因素

在新型电力系统向“源网荷储”协同转型的背景下&#xff0c;微电网作为整合分布式能源、优化终端能源配置、保障供电安全的核心载体&#xff0c;其运行状态的精准把控是实现高效、稳定、安全运行的前提。功率流计算作为微电网分析、设计、调控与运维的核心基础&#xff0c;本质…...

黑马点评实战篇|第六篇:秒杀优化

秒杀优化思路先看原本的思路&#xff1a;1、查询优惠卷2、判断秒杀库存是否足够3、查询订单4、校验是否是一人一单5、扣减库存6、创建订单这6大步骤会在一个线程里串行执行&#xff0c;大大拖慢响应速度&#xff0c;所以需要程序异步执行优化思路只需要把耗时较短的流程&#x…...

5分钟搞定GEO优化源码系统,多平台一键投喂源码系统搭建全攻略

温馨提示&#xff1a;文末有资源获取方式AI搜索时代已全面到来&#xff01;想让你的企业品牌和产品出现在DeepSeek、豆包等AI的搜索结果中&#xff1f;GEO&#xff08;生成式引擎优化&#xff09;是必经之路。今天带来春哥团队GEO优化源码系统&#xff0c;支持多平台一键投喂、…...

NIQ在Ask Arthur中推出全新AI驱动分析功能的测试版

AI引导分析帮助品牌和零售商将数据转化为可直接用于决策的洞察消费者情报领域的全球领导者NIQ (NYSE: NIQ)在NIQ Discover平台的Ask Arthur中推出了全新AI驱动分析功能的测试版。升级后的服务可引导用户完成端到端分析&#xff0c;帮助他们识别数据中的关键信息、理解趋势成因&…...

vue文件template ,script, style 多文件写法小记

当页面需求大代码量过多时&#xff0c;*.vue文件中包含很多的html&#xff0c;JS &#xff0c;css 代码&#xff0c;对于后续的代码的维护管理非常的不便&#xff0c;这个时候就有必要把JS &#xff0c;Template ,CSS 分开写&#xff0c;像微信小程序一样&#xff0c;这里记录几…...

朱雀越严,我这个工具越好用|亲测稳过

很多内容从业者对朱雀的第一反应是恐慌&#xff0c;模板失效、爆文文案不好用了&#xff0c;连正常润色都担心「误伤」。但真正跑了一段之后&#xff0c;我的体感反而是&#xff0c;越严苛的检测&#xff0c;越倒逼你回到「表达本身」&#xff0c;而一些为 AI 原生创作设计的平…...

2026年AI岗12倍疯涨!年薪破亿?普通人如何抢占未来入场券?

文章指出2026年AI岗位同比增长12倍&#xff0c;高薪人才年薪可达千万。回顾2005-2025年薪资排行变迁&#xff0c;呈现制造业、房地产、互联网、金融科技到AI的五大时代轮替&#xff0c;每一轮都伴随着财富重新分配。AI浪潮下&#xff0c;人才垄断程度更高、门槛更高、替代更快&…...

使用格子玻尔兹曼方法模拟方腔流:生成流线、速度、压力图并保存动态展示的研究结果

使用格子玻尔兹曼方法&#xff08;LBM&#xff09;模拟方腔流&#xff0c;生成流线、速度、压力图&#xff0c;并可保存动图.今天咱们来玩点流体力学的小把戏——用格子玻尔兹曼方法&#xff08;LBM&#xff09;整一个方腔流动模拟。这玩意儿比传统NS方程解法有意思多了&#x…...

刷题题单目录

题单 这篇文章将是本人刷题题单记录帖子,为了督促自己以及分享自己的刷题感想 5.最长回文子串 3.无重复字符的最长子串 200.岛屿数量 56.合并区间 239.滑动窗口最大值 22.括号生成 121.买卖股票的最佳时机 206.反转链表 72.编辑距离 25.K个一组翻转链表 1143.最长公共子序列 10…...

Python 模块和包引用配置详解

导读在 Python 开发中&#xff0c;高效管理模块&#xff08;Module&#xff09;与包&#xff08;Package&#xff09;的引用是构建可维护、可扩展项目的基石。本指南将从基础语法、包结构配置、搜索路径机制 (sys.path) 以及最佳实践四个维度进行深度解析&#xff0c;帮助您解决…...

06Halcon图像预处理报告

Halcon图像预处理学习报告一、概述图像预处理是机器视觉系统中的关键环节&#xff0c;其目的是改善图像质量&#xff0c;突出感兴趣的特征&#xff0c;为后续的图像分析和识别奠定基础。Halcon作为业界领先的机器视觉软件库&#xff0c;提供了丰富的图像预处理算子。本报告将重…...

两会洞察|底座不稳,智能难成:能源行业数字化的必由之路

今年两会&#xff0c;“能源安全”“新型能源体系”“数字基础设施”“安全发展”等关键词持续成为关注焦点。对于能源行业而言&#xff0c;这些表述并不只是宏观层面的政策方向&#xff0c;更意味着行业正在进入一个新的阶段&#xff1a;数字化建设不再停留在单点系统上线和局…...

AD 极坐标操作方式

问题描述 关于AD软件一些操作&#xff0c;因为好久没有使用&#xff0c;很多操作导致忘记&#xff0c;做下记录。 解决方案&#xff1a; 1.AD极坐标调出并设置&#xff0c;根据自己项目来设置步长&#xff0c;角度方向等。最后&#xff0c;成功是建立在实践基础上&#xff0c;遇…...

2026年热销榜单:高品质花园围栏护栏厂家推荐

在2026年&#xff0c;花园围栏的需求持续增长&#xff0c;各种护栏厂家纷纷推出创新产品。不同品牌凭借其独特的设计和高品质材料&#xff0c;满足了消费者对美观性和安全性的双重需求。我们将介绍一些市场中备受推崇的厂家&#xff0c;包括它们的设计理念、产品特色及用户反馈…...

JAVA国际版人力资源招聘系统源码:社招+校招双模式,多语言可商用

随着全球化人才流动加剧&#xff0c;企业跨境招聘、国际人才求职需求日益旺盛&#xff0c;同时社会招聘与校园招聘的场景差异显著&#xff0c;传统招聘系统多局限于单一招聘类型、单语言场景&#xff0c;无法适配国际企业多语言招聘、社招校招分层管理、跨境人才对接的核心需求…...

4.4 网络运营商的内部

&#x1f4da; 本文是《网络是怎样连接的》精读系列第 19 篇&#xff0c;全书逐章精讲、通俗拆解&#xff0c;帮你从零吃透计算机网络的底层逻辑。当数据包通过接入网的隧道技术&#xff0c;成功抵达运营商的 BAS&#xff08;宽带接入服务器&#xff09;后&#xff0c;就正式踏…...

西安AI搜索优化软件亲测效果分享

行业痛点分析随着生成式人工智能&#xff08;如ChatGPT、DeepSeek、Gemini等&#xff09;的普及&#xff0c;用户获取信息的方式正在发生重大变化。越来越多的用户不再通过传统搜索引擎逐个点击网站&#xff0c;而是直接通过AI获得整合答案。然而&#xff0c;这一新模式也带来了…...

零代码玩转自动化:OpenClaw可视化编排功能入门

让自动化触手可及 对于很多非技术用户来说&#xff0c;编写代码来配置工作流是一个高门槛。OpenClaw的可视化编排功能通过图形化界面&#xff0c;让用户可以像搭积木一样构建自动化流程&#xff0c;无需编写代码就能实现复杂的业务逻辑。 本文将带你了解OpenClaw可视化编排功能…...

隧道超声波风速风向检测器:赋能智慧交通管理、灾害预防与应急管理

隧道超声波风速风向检测器凭借其高精度、实时性、抗干扰性强及无机械磨损等特性&#xff0c;在智慧交通管理、灾害预防与应急管理中发挥着关键作用&#xff0c;为隧道安全运营提供了强有力的技术支撑。一、智慧交通管理&#xff1a;精准感知气流&#xff0c;优化通风策略实时监…...

互联网医疗场景下的大厂Java面试全流程 —— Spring Boot、MyBatis、Redis、Kafka、Spring Security、AI智能分析解读

互联网医疗场景下的大厂Java面试全流程 —— Spring Boot、MyBatis、Redis、Kafka、Spring Security、AI智能分析解读 场景设定 互联网医疗平台&#xff0c;包含在线问诊、处方开具、药品下单、支付、数据分析等功能&#xff0c;要求高并发、强安全、实时消息推送与智能辅助诊断…...

AI智能体协议乱象背后:MCP、A2A、ACP……谁将成为下一代互联网的“HTTP“?

在AI智能体&#xff08;Agent&#xff09;迅猛发展的当下&#xff0c;MCP、A2A、ACP、UTCP、ANP……各种协议层出不穷&#xff0c;几乎每隔一段时间&#xff0c;科技公司就会为“字母家族”增添新成员。归根结底&#xff0c;所有AI智能体协议的目标都是标准化智能体的通信方式&…...

选对自动获客软件,少走弯路!AI 招财兔实测体验

市面上自动获客软件五花八门&#xff0c;但大多功能单一、操作复杂、稳定性差、效果不明显&#xff0c;企业买回去往往无法落地。AI 招财兔自动获客软件凭借 “全功能、易操作、高转化、超稳定” 四大特点&#xff0c;成为企业真正可落地的首选获客工具。实测体验中&#xff0c…...

基于Systick系统滴答定时器的延时时间计算

介绍一套嵌入式系统中常用的非阻塞延时 / 超时判断工具宏&#xff1a;#define SysTime() HAL_GetTick() //ms级别 #define SysTimeDiff(new, old) ((new) - (old)) #define SysTimeDiffCurrent(oldTime) SysTimeDiff(SysTime(), (oldTime)) #define SysTimeHasPast(oldTime…...

软件测试工程师必须掌握的数据库基础知识:从入门到实战

在软件测试工作中&#xff0c;数据库知识不是"加分项"&#xff0c;而是"必备项"。无论你是做功能测试、接口测试还是自动化测试&#xff0c;几乎每一天都会和数据库打交道&#xff1a;验证数据是否正确写入构造测试数据分析Bug产生的原因性能测试中定位慢S…...

抖音豆包九宫格验证码识别

一、简介 上图是抖音九宫格验证码图片的样例图片。这款验证码确实有很大的难度&#xff0c;有一下几个特点&#xff1a; 1、首先是图片种类非常多。 2、其次图片都是由AI随机生成&#xff0c;每一张图片都不一样。 3、还需要结合语义进行理解 二、识别准备 经过我们几个月…...