整体而言: 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来得好。

最新文章

  1. ImageView缩放选项
  2. 《JavaScript DOM 编程艺术(第2版)》读书笔记
  3. 利用VMware虚拟机(Android-x86 2.2)和eclipse,调试安卓代码
  4. php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;
  5. 【Java】Java原生的序列化和反序列化
  6. Pentaho Data Integration (三) Pan
  7. [Locked] Binary Tree Vertical Order Traversal
  8. double精度的坑与BigDecimal
  9. nginx-configure执行大致流程
  10. zf-关于更换页面,的各种问题。
  11. Spring Security Filter详解
  12. 基于HTML5和WebGL的碰撞测试
  13. Oracle:sqlplus前缀显示当前用户
  14. adb命令介绍与使用
  15. Linux 高性能服务器编程——多线程编程
  16. rails自动生成大量记录的方法
  17. 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
  18. Linux 高级文件管理
  19. 关于在Struts2的Action中使用domain模型接收参数的问题
  20. Linux(CentOS)安装Mysql数据库

热门文章

  1. 发送HTTP请求方法- 留着自用
  2. 华为开发者大会HDC2022:HMS Core 持续创新,与开发者共创美好数智生活
  3. python 的time、datetime模块
  4. 链表实现-回文palindrome判断
  5. 【OpenStack云平台】网络控制节点 HA 集群配置
  6. AR路由器如何配置Portal认证(二层网络)
  7. Day17:稀疏数组的超细详解
  8. vue项目中,alert使用
  9. i春秋xss平台
  10. 关于 .NET 在不同操作系统中 IO 文件路径拼接方法结升级 .NET 7 后注意到的一个小坑