讲师中心 微信公众号
AI工具推荐 视频效率加速

C++中的std::sort底层是用什么排序?(内省排序Introsort)

小芳大大_3229

小芳大大_3229

发布时间:2026-01-11 15:00:15

|

603人浏览过

|

来源于php中文网

原创

std::sort底层采用内省排序(Introsort):小数组用插入排序,递归过深时切堆排序,兼顾性能与最坏O(n log n)保障;主流实现(libstdc++、libc++、MSVC)均如此,但标准仅规定复杂度,未强制算法。

c++中的std::sort底层是用什么排序?(内省排序introsort)

std::sort 用的是内省排序(Introsort)

标准库的 std::sort 在绝大多数主流实现(如 libstdc++、libc++、MSVC STL)中,底层确实是 内省排序——它不是单一算法,而是 introsort:在快速排序递归深度超过阈值时,自动切换到堆排序;对小数组(通常 ≤16 或 ≤32 元素)则改用插入排序。这种组合是为了兼顾平均性能、最坏情况保障和小数据常数开销。

为什么不用纯快排或纯堆排?

纯快速排序最坏时间复杂度是 O(n²)(比如已排序数组+固定轴点),而堆排序稳定 O(n log n) 但常数大、缓存不友好;插入排序对小数组实际更快。内省排序通过监测递归深度(一般设为 2 × floor(log₂ n))来防退化,一旦超限就切到堆排序,从而保证最坏也是 O(n log n)

  • libstdc++(GCC):用 std::__introsort_loop 实现,深度阈值为 2 * std::__lg(__last - __first)
  • libc++(Clang):同样基于 introsort,小数组阈值为 30,深度限制为 2 * __lg(__last - __first)
  • MSVC STL:也采用 introsort,小数组用插入排序,递归深度超限时转堆排序

你不能依赖具体实现,但可以观察行为

标准只规定 std::sort 必须是 O(n log n) 平均与最坏复杂度,且是“不稳定排序”;它没强制要求用 introsort——理论上某实现用 timsort 也合法(只要满足复杂度和稳定性约束)。但现实中所有主流实现都选 introsort,因为它是工程上最平衡的选择。

  • 无法通过代码直接调用 introsort 函数——它只是内部实现细节,不在标准接口里
  • 如果需要确定性行为(比如调试/测试),不要假设分区点或比较次数;应避免依赖排序中间状态
  • 自定义比较器必须满足严格弱序(strict weak ordering),否则内省排序可能崩溃或无限循环

想验证?看 GCC 的 libstdc++ 源码片段

bits/stl_algo.h 中,std::sort 最终会进入 __introsort_loop 函数。关键逻辑如下:

Full access to all Exchange 2010 EWS functions, should work with other EWS Open Source
Full access to all Exchange 2010 EWS functions, should work with other EWS Open Source

可完全访问 Exchange 2010 EWS,管理邮件、文件夹、附件、日历事件、联系人、任务及外出设置。

下载

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

template<typename _RandomAccessIterator, typename _Size>
void
__introsort_loop(_RandomAccessIterator __first,
                 _RandomAccessIterator __last,
                 _Size __max_depth)
{
  while (__last - __first > int(_S_threshold))
    {
      if (__max_depth == 0)
        {
          std::__partial_sort(__first, __last, __last); // 堆排序入口
          return;
        }
      --__max_depth;
      _RandomAccessIterator __cut =
        std::__unguarded_partition(__first, __last,
                                   std::__median(*__first,
                                                 *(__first + (__last - __first)/2),
                                                 *(__last - 1)));
      __introsort_loop(__cut, __last, __max_depth);
      __last = __cut;
    }
  std::__insertion_sort(__first, __last); // 小数组走插入
}

注意:_S_threshold 通常是 16,__median 选三数中位数做 pivot,__unguarded_partition 是无边界检查的分区——这些全是 introsort 典型特征。

真正容易被忽略的是:哪怕你传入完全有序的数组,std::sort 也不会退化成 O(n²),但它的运行路径(快排→堆排→插排)和比较次数仍取决于具体实现和输入规模,没法跨平台预测。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1098

2023.09.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3028

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4249

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3649

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

366

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

4587

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2088

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

4716

2023.08.14

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn