std::sort 学习:一种递归分治方法

// std::sort 学习:一种递归分治方法

今天看了看 stl 的 std::sort 的代码,众所周知,这个函数是在快速排序递归太深的时候使用堆排序防止过度退化,但是今天说的不是这个。我们只看快速排序的部分。

我们一般实现快速排序大概是这样的(本王随意写了个用下标当参数的排序函数,领会意思即可)。

  1. void quick_sort(int first, int last) // 某个数组的 [first, last)




  2. if ((last - first) > 1) { 

  3. int middle = divide(first, last); // 划分 

  4. quick_sort(first, middle); 

  5. quick_sort(middle, last); 





但是 stl 里面的代码不是这个形式,它大概是这个样子。

  1. void quick_sort(int first, int last)




  2. for (; (last - first) > 1; ) { 

  3. int middle = divide(first, last); 

  4. quick_sort(first, middle); 

  5. first = middle; 





很容易发现,这个写法跟前面的写法执行的过程是完全一样的,但是函数调用减少了一半,节省了开销。

时间: 2024-10-05 16:53:20

std::sort 学习:一种递归分治方法的相关文章

(java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待

selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java.util.Set;import java.util.concurrent.TimeUnit; import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.openqa.selenium.By;import org.openqa.

深度学习数学《矩阵分析与应用第2版》资料+《最优化理论与算法第2版》电子书资料+《人工智能一种现代的方法第3版》资料学习

理性模型的建模和算法,经验模型的决策建模和算法,构成了目前人工智能的基础,基于学习反馈的模型构成了它的进化.学习人工智能,必须有较好的数学基础. <矩阵分析与应用第2版>电子书中总结了大量线性代数的知识,是一本很不错的书,数学专业可以跳过,主要是给工科生用的.归纳了不少论文中的解法,是做信号处理的一本很不错的工具书,建议认真学习,做电子笔记,对书的重点内容要好好研究. <矩阵分析与应用第2版>系统.全面地介绍矩阵分析的主要理论.具有代表性的方法及一些典型应用,包括矩阵代数基础.特殊

Java学习(十八):二叉树的三种递归遍历

二叉树的三种递归遍历: 1 public class StudentNode 2 { 3 private String name; 4 5 private StudentNode leftNode; 6 7 private StudentNode rightNode; 8 9 public String getName() 10 { 11 return name; 12 } 13 14 public void setName(String name) 15 { 16 this.name = na

科普:std::sort干了什么

std::sort算是STL中对OIer比较友好的函数了,但你有想过sort是如何保证它的高速且稳定吗? 我们首先来到第一层:sort函数 template<typename _RandomAccessIterator> inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last) { //申请使用随机访问迭代器 __glibcxx_function_requires(_Mutable_RandomA

为什么不要自己乱造轮子:std::sort方法的实现

引言 关于标准库的sort的实现,各种贴子文章看得人眼花缭乱,还是看code吧.本文代码取自Ubuntu 18.04自带的GNU STL.(个人觉得MSVC版本的STL可阅读性并不是那么好) std::sort std::sort经过一些必要的检查后调用了std::__sort并且指定了默认的比较器,所以sort默认是从小到大排列. template<typename _RandomAccessIterator> inline void sort(_RandomAccessIterator _

递归分治算法(一)-归并排序算法

前言: 分治法是一种算法设计思想,所谓分治,意为分而治之,是指将一个难以直接解决的大问题,递归的分割成一些规模的较小的问题,以便逐个解决.采用分治法设计的算法通常用到递归算法来实现,故标题为递归分治. 归并排序算法 归并就是将两个或两个以上的有序表合并成一个新的有序表.归并排序就是将无序的待排序的序列分解成若干个有序的子序列,并把有序子序列合并为整体有序序列的过程.一般分为2-路归并排序和多路归并排序. 他的大概流程如下图: 我们来看看java代码怎么写的: package guibing; /

《Python基础教程(第二版)》学习笔记 -&gt; 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__

深度学习、自然语言处理和表征方法

简介 过去几年,深度神经网络在模式识别中占绝对主流.它们在许多计算机视觉任务中完爆之前的顶尖算法.在语音识别上也有这个趋势了. 虽然结果好,我们也必须思考……它们为什么这么好使? 在这篇文章里,我综述一下在自然语言处理(NLP)上应用深度神经网络得到的一些效果极其显著的成果.我希望能提供一个能解释为何深度神经网络好用的理由.我认为这是个非常简练而优美的视角. 单隐层神经网络 单隐层神经网络有一个普适性(universality):给予足够的隐结点,它可以估算任何函数.这是一个经常被引用的理论,它

GDB实践:一场std::sort引发的coredump

以前只掌握gdb一些基础知识,还没有真正"实战"过.刚好最近同事一个进程coredump了,原因比较深,正好利用这个机会来分析下 // @ 运行:gdb [可执行程序] -c [coredump文件] gdb edu_info_recommend_svr -c core_edu_info_recomm // @ 查看堆栈信息:bt (backtrace) (gdb) bt 10 #0 0x00007fa0809b6144 in __strcmp_sse42 () from /lib64