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


相关推荐: 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用法