C++ 怎么实现计数排序 C++ 非比较排序算法代码【算法】
发布时间 - 2026-01-30 00:00:00 点击率:次计数排序适合值域较小的整数(max−min≤10⁶),需偏移处理负数,时间复杂度O(n+k),空间O(k),非原地但可稳定排序;仅当输入范围确定且性能瓶颈明显时优于std::sort。
计数排序适合什么数据范围
计数排序只适用于整数,且值域不能太大——理想情况是 max - min 在几万以内。如果数组里有 INT_MAX 和 0,直接开桶会崩溃或超内存。实际用前先检查:if (max_val - min_val > 1e6) return;。
它不比较元素,而是统计每个值出现次数,所以时间复杂度稳定是 O(n + k)(k 是值域大小),但空间代价是 O(k)。
怎么处理负数和非从 0 开始的整数
标准计数排序常假设输入是非负整数,但真实场景常有负数。解决办法是做偏移:找出 min_val,把所有数减去它,映射到 [0, max-min] 区间。
- 统计时下标为
ar
r[i] - min_val
- 还原时结果值为
index + min_val - 桶数组大小必须是
max_val - min_val + 1,别漏掉+1
原地排序还是额外输出数组
计数排序天然不适合真·原地排序(无法避免桶数组),但可以避免二次遍历输入数组来填结果。常见写法是先算前缀和,再从右往左反向填入输出数组,保证稳定性。
示例关键片段:
vectorcount(max_val - min_val + 1, 0); for (int x : arr) count[x - min_val]++; // 前缀和:count[i] 表示 ≤ (min_val + i) 的元素个数 for (int i = 1; i < count.size(); i++) count[i] += count[i-1]; vector output(arr.size()); // 从后往前,保持相等元素的相对顺序 for (int i = arr.size() - 1; i >= 0; i--) { int idx = arr[i] - min_val; output[--count[idx]] = arr[i]; }
和 std::sort 比,什么时候该用手写计数排序
不是“更快就一定更好”。std::sort 平均 O(n log n),但常数极小、缓存友好、支持任意类型和自定义比较。手写计数排序只在以下情况值得考虑:
- 输入确定是小范围整数(比如成绩 0–100、年份 1970–2030)
-
性能瓶颈真卡在排序上,且 profiler 显示
std::sort占比高 - 你控制输入来源,能确保无非法值(比如越界、NaN、非整数)
漏掉范围校验或没处理负数,上线后遇到异常输入就会访问越界——这类 bug 往往只在特定数据下触发,比逻辑错误更难定位。
# c++
# 排序算法
# 性能瓶颈
# if
# sort
# 算法
# bug
# 值域
# 只在
# 比高
# 就会
# 什么时候
# 遍历
# 适用于
# 这类
# 太大
# 自定义
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
python中快速进行多个字符替换的方法小结
再谈Python中的字符串与字符编码(推荐)
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
图册素材网站设计制作软件,图册的导出方式有几种?
如何快速上传建站程序避免常见错误?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
如何实现javascript表单验证_正则表达式有哪些实用技巧
Mybatis 中的insertOrUpdate操作
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
新三国志曹操传主线渭水交兵攻略
BootStrap整体框架之基础布局组件
如何用PHP快速搭建高效网站?分步指南
如何在阿里云高效完成企业建站全流程?
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
android nfc常用标签读取总结
canvas 画布在主流浏览器中的尺寸限制详细介绍
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
微信公众帐号开发教程之图文消息全攻略
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
浅谈javascript alert和confirm的美化
什么是javascript作用域_全局和局部作用域有什么区别?
如何在建站宝盒中设置产品搜索功能?
html如何与html链接_实现多个HTML页面互相链接【互相】
如何快速搭建高效WAP手机网站吸引移动用户?
lovemo网页版地址 lovemo官网手机登录
Linux安全能力提升路径_长期防护思维说明【指导】
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
iOS中将个别页面强制横屏其他页面竖屏
文字头像制作网站推荐软件,醒图能自动配文字吗?
javascript基本数据类型及类型检测常用方法小结
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
JS经典正则表达式笔试题汇总
浅谈redis在项目中的应用
如何在VPS电脑上快速搭建网站?
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
实例解析angularjs的filter过滤器
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
高端云建站费用究竟需要多少预算?
,南京靠谱的征婚网站?
Laravel怎么判断请求类型_Laravel Request isMethod用法


