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 】
相关推荐:
如何挑选最适合建站的高性能VPS主机?
微信小程序制作网站有哪些,微信小程序需要做网站吗?
如何快速查询网站的真实建站时间?
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何快速选择适合个人网站的云服务器配置?
LinuxCD持续部署教程_自动发布与回滚机制
Laravel安装步骤详细教程_Laravel环境搭建指南
北京网站制作的公司有哪些,北京白云观官方网站?
如何快速重置建站主机并恢复默认配置?
北京的网站制作公司有哪些,哪个视频网站最好?
详解Oracle修改字段类型方法总结
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
,南京靠谱的征婚网站?
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何在建站之星绑定自定义域名?
黑客如何利用漏洞与弱口令入侵网站服务器?
Android使用GridView实现日历的简单功能
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
如何在阿里云服务器自主搭建网站?
七夕网站制作视频,七夕大促活动怎么报名?
Laravel如何处理和验证JSON类型的数据库字段
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
如何用西部建站助手快速创建专业网站?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
MySQL查询结果复制到新表的方法(更新、插入)
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
如何在腾讯云服务器上快速搭建个人网站?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Python制作简易注册登录系统
海南网站制作公司有哪些,海口网是哪家的?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
公司门户网站制作流程,华为官网怎么做?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
C++用Dijkstra(迪杰斯特拉)算法求最短路径
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
LinuxShell函数封装方法_脚本复用设计思路【教程】
活动邀请函制作网站有哪些,活动邀请函文案?
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】


