《STL源码剖析》Sort排序分析
整体而言: sort算法在数据量大时采用Quick Sort(快速排序),一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负担,就改用Insertion Sort(插入排序),如果递归层次过深,还会改用Heap Sort(堆排序),先分别简单介绍Quick Sort
Insertion Sort插入排序
Insertion sort以双层循环的形式进行,外循环便利整个序列,每次迭代决定出一个自区间,内循环遍历自区间,将自区间内的没一个“逆转对”倒转过来。所谓“逆转对”是指任何两个迭代器i,j,i
template<class RandomAccessIterator>
void __insertion_sort(RandomAccessIterator first,RandomAccessIterator last){
if(first==last) return;
for(RandomAccessIterator i=first+1;i!=last;++i)//外循环
__linear_insert(first,i,value_type(first));
//以上[first,i)形成一个子区间
}
template <class RandomAccessIterator,class T>
inline void__linear_insert(RandomAccessIterator first,Random AccessIterator last,T*){
T value=*last;//记录尾元素
if(value<*first){
copy_backward(first,last,last+1);//将整个区间拷贝
*first=value;
}
else//尾不小于头
__unguarded_linear_insert(last,value);
}
template<class RandomAccessIterator,class T>
void __unguarded_linear_insert(RandomAccessIterator first,Random AccessIterator last,T value){
RandomAccessIterator next=last;
--next;
//insertion sort的内循环
//注意,一旦不再出现逆转对,循环就可以结束了
while(value<*next){//逆转对存在
*last==*next;
last=nex;
--next;
}
*last=value;
}
Quick Sort快速排序
Quick Sort是目前已知的最快的排序法,平均复杂度为O(NlogN),最坏情况下将达O(N²)。不过IntroSort(非常类似于median-of-three QuickSort的一种排序算法)可将最坏情况推进到O(NlogN)。早期的STLsort算法都采用QuickSort,SGI STL已经改用IntroSort。
median-of-three(三点之中值):任意一个元素都可以被送来当枢轴(pivot),但其合适与否将影响QuickSort的效率,为了避免“元素当初输入时不够随机”所带来的恶化效应,最理想的最稳当的方法就是取整个序列的头、尾、中央三个位置的元素,以其中值作为枢轴,这种做法成为median-of-three partitioning,或成为median-of-QuickSort,为了能够快速取出中央位置的元素,显然迭代器必须能够快速取出中央位置的元素,显然迭代器必须能够随机读取,亦即是个RandomAccessIterators。
final insertion sort
sort采用的优化方案,即前面的所有排序步骤都采用QuickSOrt,只有最后一次采用insertionSort,因为insertionSort在面对“几近排序”的序列时,能拥有很好的表现。
Inrtosort(Introspective sorting,内省式排序)
其行为在大部分情况下几乎与median-of-three Quick Sort完全相同(当然也就一样快,但是当分割行为有恶化为二次行为的倾向时,能够自我检测,转而改用Heap Sort,使得效率维持在HeapSort的O(NlogN),又比一开始就用HeapSort来得好。
《STL源码剖析》Sort排序分析的更多相关文章
- STL"源码"剖析-重点知识总结
STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略多 :) 1.STL概述 STL提供六大组件,彼此可以组合 ...
- 【转载】STL"源码"剖析-重点知识总结
原文:STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点 ...
- STL"源码"剖析
STL"源码"剖析-重点知识总结 STL是C++重要的组件之一,大学时看过<STL源码剖析>这本书,这几天复习了一下,总结出以下LZ认为比较重要的知识点,内容有点略 ...
- STL源码剖析之组件
本篇文章开始,进行STL源码剖析的一些知识点,后续系列笔记全是参照<STL源码剖析>进行学习记录的 STL在现在的大部分项目中,实用性已经没有Boost库好了,毕竟STL中仅仅提供了一些容 ...
- STL源码剖析 迭代器(iterator)概念与编程技法(三)
1 STL迭代器原理 1.1 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...
- 《STL源码剖析》相关面试题总结
原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...
- STL源码剖析之序列式容器
最近由于找工作需要,准备深入学习一下STL源码,我看的是侯捷所著的<STL源码剖析>.之所以看这本书主要是由于我过去曾经接触过一些台湾人,我一直觉得台湾人非常不错(这里不涉及任何政治,仅限 ...
- 《STL源码剖析》读书笔记
转载:https://www.cnblogs.com/xiaoyi115/p/3721922.html 直接逼入正题. Standard Template Library简称STL.STL可分为容器( ...
- 面试题总结(三)、《STL源码剖析》相关面试题总结
声明:本文主要探讨与STL实现相关的面试题,主要参考侯捷的<STL源码剖析>,每一个知识点讨论力求简洁,便于记忆,但讨论深度有限,如要深入研究可点击参考链接,希望对正在找工作的同学有点帮助 ...
- 通读《STL源码剖析》之后的一点读书笔记
直接逼入正题. Standard Template Library简称STL.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adap ...
随机推荐
- 用copyof来复制数组
public static void main(String[] args) { //Arrays.copyOf将数组复制到另一个数组,截断.扩容 String[] a={"1", ...
- 【多服务场景化解决方案】AR虚拟技术助力智能家装
1 .介绍 总览 本应用采用了华为图形引擎服务的AR虚拟技术,您可以在手机相机里摆放想要购置的家具家电,交互式体验让您可以轻松操控它们的3D图例,以此来确定这些家具家电是否适合摆放在您的家里. 特 ...
- 题解 AT2361 [AGC012A] AtCoder Group Contest
\(\sf{Solution}\) 显然要用到贪心的思想. 既然最终的结果只与每组强度第二大选手有关,那就考虑如何让他的值尽可能大. 其实,从小到大排个序就能解决,越靠后的值越大,使得每组强度第二大选 ...
- photoshop 2021 for mac安装教程,亲测可用!!!
小编分享下photoshop cc 2021 for mac 安装教程,适配M1芯片,让大家完美使用ps2021,畅享所有新功能Adobe Photoshop2021(简称PS) 新版本主要增加了Ne ...
- 深度剖析Java的volatile实现原理,再也不怕面试官问了
上篇文章我们讲了synchronized的用法和实现原理,我们总爱说synchronized是重量级锁,volatile是轻量级锁.为什么volatile是轻量级锁,体现在哪些方面?以及volatil ...
- ubuntu下Mysql安装与root密码重置
一.安装 1.首先更新本地存储库索引,执行sudo apt update 2.从APT存储库安装MySQL,执行sudo apt install MySQL-server,在安装过程中,可能会出现[Y ...
- Pyhton基础部分:6、与用户交互、基础运算符
目录 一.python数据类型 1.布尔值bool 2.元组tuple 3.集合set 二.与用户交互 1.获取用户输入 2.输出内部信息 3.语言环境差异 三.格式化输入 1.代码实现 2.注意事项 ...
- 👍SpringSecurity单体项目最佳实践
SpringSecurity单体项目最佳实践 到这里,我们的SpringSecurity就已经完结啦,文章中可能有些地方不能做到全面覆盖,视频教程地址 初始项目地址 完成项目地址 1.搭建环境 建议下 ...
- 如何通过Java代码给Word文档添加水印?
Word中可以为文档添加的水印分为两种形式:文字水印和图片水印.水印是一种数字保护的手段,在文档上添加水印可以传达有用信息,或者在不影响正文文字显示效果的同时,为打印文档增添视觉趣味,能起到传递信息, ...
- Ian Lance Taylor
https://img.mukewang.com/5a9dfda50001933e23006728.png 在GCC的世界中,没有人比Ian更火.在GCC maillist中,Ian的身影呈现在前端中 ...