sort()函数是STL中我们常用到的一个函数,之前好像在哪里模模糊糊的看到过是用快速排序进行排序的
但底层究竟是怎样进行排序的,今天我们就来进行一个探索
这里先给出一个结论:STL中的sort()函数的排序方法是以快速排序+堆排序+插入排序为组合的排序
STL中所有的关系型容器都拥有自动排序功能(底层结构采用RB-tree),所以不需要用到这个sort算法
首先sort()函数的主体躯干是快速排序,我们先来看一看快速排序的优劣,已经改良方式
下图是一个标准的常见快速排序
快排的优点是对于数据量的数据处理的时候速度很快,但是对于小数据量的数据处理起来并不具优势
总的来说,对于快速排序算法的改进主要集中在三个方面:
1 选取一个更好的中轴值
2 根据产生的子分区大小调整算法
3 不同的划分分区的方法
sort()函数对于快速排序的改进也就刚好体现在了这三点上
选取一个更好的中轴值
这里STL采用了一个Median-of-Three(三点中值)的方法进行选值
简单描述就是比较队首队尾和队中三个值,选一个中间值作为中轴值,这样排序结果产生的分区就更加均匀,更具效率
根据产生的子分区大小调整算法&&不同的划分分区的方法
针对于第二点和第三点STL也提出了两项优化