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

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

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

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

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

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

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

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

 

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

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

    1 选取一个更好的中轴值

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

    3 不同的划分分区的方法

 

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

选取一个更好的中轴值

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

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

 

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值