真核硬货——STL中的sort()函数详解

本文详细解析了STL中sort()函数的排序机制,它结合了快速排序、堆排序和插入排序。通过三点中值选取中轴值,优化子分区处理和在小数据量时使用插入排序,提高效率。源代码分析介绍了introsort()算法,它在快速排序性能恶化时切换到堆排序,确保高效运行。

sort()函数是STL中我们常用到的一个函数,之前好像在哪里模模糊糊的看到过是用快速排序进行排序的

但底层究竟是怎样进行排序的,今天我们就来进行一个探索

这里先给出一个结论:STL中的sort()函数的排序方法是以快速排序+堆排序+插入排序为组合的排序

STL中所有的关系型容器都拥有自动排序功能(底层结构采用RB-tree),所以不需要用到这个sort算法

首先sort()函数的主体躯干是快速排序,我们先来看一看快速排序的优劣,已经改良方式

下图是一个标准的常见快速排序

 

快排的优点是对于数据量的数据处理的时候速度很快,但是对于小数据量的数据处理起来并不具优势

总的来说,对于快速排序算法的改进主要集中在三个方面:

    1 选取一个更好的中轴值

    2 根据产生的子分区大小调整算法

    3 不同的划分分区的方法

 

sort()函数对于快速排序的改进也就刚好体现在了这三点上

选取一个更好的中轴值

这里STL采用了一个Median-of-Three(三点中值)的方法进行选值

简单描述就是比较队首队尾和队中三个值,选一个中间值作为中轴值,这样排序结果产生的分区就更加均匀,更具效率

 

根据产生的子分区大小调整算法&&不同的划分分区的方法

针对于第二点和第三点STL也提出了两项优化

<think>首先,用户的问题是:“我想查找C++中vector的头文件 请问C++ vector头文件是什么”。这是一个直接的问题,询问C++中vector的头文件。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答实可靠。 参考站内引用: - 引用[1]: 解释了vector的定义和优点。 - 引用[2]: 详细描述了vector头文件的使用,包括声明、添加元素、访问元素等。 - 引用[3]: 讨论了vector的存储管理。 - 引用[4]: 提供了vector构造函数的示例代码。 - 引用[5]: 比较了resize和shrink_to_fit的区别。 用户的问题是关于C++ vector头文件的名称。从引用中,我可以直接提取信息: - 引用[2] 明确说:“#include <vector> using namespace std;” - 引用[3] 标题是“C++头文件容器库——vector”。 - 引用[4] 标题是“C++硬货——vector头文件【保姆级教学】”,并包含代码示例。 - 引用[5] 标题是“C++ 头文件系列(vector)”。 所以,vector的头文件是<vector>。 回答结构: 1. **直接回答问题**:先给出简洁的答案。 2. **解释细节**:提供一些上下文,如如何使用它。 3. **引用支持**:自然地添加引用标识。 4. **生成相关问题**:在最后添加相关问题部分。 生成相关问题: - 根据用户的问题,相关问题应该围绕vector头文件的使用、优点、常见操作等。 - 例如: 1. 如何在C++中使用vector头文件? 2. vector有哪些常用函数? 3. vector和数组有什么区别? 4. 如何优化vector的性能? 确保回答实可靠:基于提供的引用,信息是准确的。 最终回答框架: - 开头:直接回答头文件是<vector>。 - 中间:简要解释如何包含它,并提到一些基本使用。 - 结尾:添加相关问题。</think>### C++中vector的头文件 在C++中,`vector` 是一个封装动态数组的标准库容器,属于标准模板库(STL)的一部分。其头文件是 **`<vector>`**。使用时,需要在代码顶部包含该头文件,通常结合 `using namespace std;` 来简化语法[^2][^3][^5]。 #### 基本使用方法: 1. **包含头文件**: 在C++源文件中,添加以下代码: ```cpp #include <vector> // 引入vector头文件 using namespace std; // 使用标准命名空间 ``` 这允许你直接使用 `vector` 类,而无需前缀如 `std::vector`[^2][^4]。 2. **声明和初始化vector**: 例如,声明一个整数类型的vector: ```cpp vector<int> myVector; // 声明一个空的vector ``` 其他初始化方式包括: - 使用元素初始化:`vector<int> v = {1, 2, 3};` - 指定大小和默认值:`vector<int> v(10, 0); // 10个元素,值均为0`[^4][^5]。 3. **常用操作**: - 添加元素:`myVector.push_back(42); // 在尾部添加元素` - 访问元素:`int element = myVector[0]; // 通过下标访问` - 获取大小:`size_t size = myVector.size(); // 返回元素个数`[^2][^3]。 更多函数如 `resize()`(调整大小)或 `shrink_to_fit()`(优化内存)可参考文档[^5]。 #### 为什么使用`<vector>`? - **优点**:自动管理内存(容量按需扩展)、支持任意数据类型、提供高效的元素访问和修改操作[^1][^3]。 - **缺点**:相比静态数组,可能有额外内存开销,但通过优化(如预分配)可缓解[^3][^5]。 如需完整示例,参考引用中的代码片段[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值