C++ 怎么实现计数排序 C++ 非比较排序算法代码【算法】

发布时间 - 2026-01-30 00:00:00    点击率:
计数排序适合值域较小的整数(max−min≤10⁶),需偏移处理负数,时间复杂度O(n+k),空间O(k),非原地但可稳定排序;仅当输入范围确定且性能瓶颈明显时优于std::sort。

计数排序适合什么数据范围

计数排序只适用于整数,且值域不能太大——理想情况是 max - min 在几万以内。如果数组里有 INT_MAX0,直接开桶会崩溃或超内存。实际用前先检查: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

原地排序还是额外输出数组

计数排序天然不适合真·原地排序(无法避免桶数组),但可以避免二次遍历输入数组来填结果。常见写法是先算前缀和,再从右往左反向填入输出数组,保证稳定性。

示例关键片段:

vector count(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格式订阅内容【教程】