0

0

C++如何进行浮点数数组的快速排序?(自定义比较函数)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-26 07:21:07

|

251人浏览过

|

来源于php中文网

原创

std::sort 可以直接排序浮点数数组,因其默认使用 operator

c++如何进行浮点数数组的快速排序?(自定义比较函数)

std::sort 为什么不能直接排浮点数数组?

因为 std::sort 默认用 比较,而浮点数的 <code> 在极小差值下会失效——比如 <code>1e-16 级别的误差会让两个“逻辑相等”的数被误判大小,导致排序不稳定甚至崩溃(std::sort 要求比较函数满足严格弱序)。这不是 bug,是 IEEE 754 的必然结果。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 永远不要对 floatdouble 数组直接用默认 std::sort
  • 必须传自定义比较函数,把“相等容忍”逻辑显式写进去
  • 容忍阈值(epsilon)要和数据量级匹配:处理 1e6 级数值时,用 1e-10 可能不够,用 1e-3 又太松

怎么写一个安全的浮点数比较函数?

核心是先判断是否“数值上可视为相等”,再决定大小关系。别用 abs(a - b) 做唯一判断——它在跨数量级比较时会失效(比如比较 <code>1e201e20 + 1)。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 用相对误差: abs(a - b) ,再 fallback 到绝对误差防零除
  • 把 epsilon 定义为 const double eps = 1e-9;,避免 magic number
  • 函数签名必须是 bool cmp(double a, double b),返回 true 表示 a 应排在 b 前面

示例:

Meituan CatPaw
Meituan CatPaw

美团推出的智能AI编程Agent

下载
const double eps = 1e-9;
auto float_less = [](double a, double b) {
    double diff = a - b;
    double scale = fmax(fabs(a), fabs(b));
    if (fabs(diff) <= eps * scale || (scale == 0 && fabs(diff) <= eps))
        return false; // 视为相等,不交换
    return diff < 0;
};
std::sort(arr, arr + n, float_less);

std::stable_sort 和 std::sort 选哪个?

如果数组里有大量“数值相等但来源不同”的浮点数(比如从不同传感器读来的近似值),且你希望它们保持原始相对顺序,就得用 std::stable_sort。但代价是:它通常比 std::sort 慢 20%–50%,且额外占用 O(n) 内存。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 只要没明确要求“相等元素保序”,一律用 std::sort
  • std::stable_sort 不解决精度问题——它照样依赖你提供的比较函数是否满足严格弱序
  • 某些 STL 实现(如 libstdc++)对 double 有特殊优化,但不可依赖;统一走自定义比较最稳妥

排序后怎么验证结果是否靠谱?

浮点排序没法像整数那样用“相邻元素非递减”简单断言。一次 for 循环检查可能漏掉因精度累积导致的局部乱序(比如第 1000 个数比第 999 个略小,但差值在 epsilon 内)。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 验证重点不是“完全有序”,而是“没有明显反序”:遍历检查 arr[i+1] - arr[i] >= -eps
  • 对首尾、中位数附近几个点做高精度打印(用 std::setprecision(17)),看是否符合预期分布
  • 如果排序后用于后续计算(如积分、插值),建议在排序前先做一次 std::unique 配合自定义谓词去重——但注意:去重本身也要用同样 epsilon 逻辑

真正麻烦的是多维浮点数据或带权重的排序场景,这时候 epsilon 的尺度选择会更敏感,得按业务单位单独校准。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

311

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

223

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

97

2026.02.12

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

592

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

240

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

127

2025.10.17

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.2万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号