1.STL 源码剖析:sort
STL 源码剖析:sort
我大抵是网页网页太闲了。
更好的源码源码阅读体验。
sort 作为最常用的分区分区 STL 之一,大多数人对于其了解仅限于快速排序。网页网页
听说其内部实现还包括插入排序和堆排序,源码源码于是分区分区ecos源码下载很好奇,决定通过源代码一探究竟。网页网页
个人习惯使用 DEV-C++,源码源码不知道其他的分区分区编译器会不会有所不同,现阶段也不是网页网页很关心。
这个文章并不是源码源码析完之后的总结,而是分区分区情侣的APP源码边剖边写。不免有个人的网页网页猜测。而且由于本人英语极其差劲,源码源码大抵会犯一些憨憨错误。分区分区
源码部分sort
首先,在 Dev 中输入以下代码:
然后按住 ctrl,鼠标左键sort,就可以跳转到头文件 stl_algo.h,并可以看到这个:
注释、模板和函数参数不再解释,我们需要关注的是函数体。
但是ps设计源码网站,中间那一段没看懂……
点进去,是一堆看不懂的#define。
查了一下,感觉这东西不是我这个菜鸡能掌握的。
有兴趣的 戳这里。
那么接下来,就应该去到函数__sort 来一探究竟了。
__sort
通过同样的方法,继续在stl_algo.h 里找到 __sort 的源代码。
同样,只看函数体部分。内容订阅网站源码
一般来说,sort(a,a+n) 是对于区间 [公式] 进行排序,所以排序的前提是 __first != __last。
如果能排序,那么通过两种方式:
一部分一部分的看。
__introsort_loop
最上边注释的翻译:这是排序例程的帮助程序函数。
在传参时,除了首尾迭代器和排序方式,还传了一个std::__lg(__last - __first) * 2,对应 __depth_limit。
while 表示,盒型库源码当区间长度太小时,不进行排序。
_S_threshold 是一个由 enum 定义的数,好像是叫枚举类型。
当__depth_limit 为 [公式] 时,也就是迭代次数较多时,不使用 __introsort_loop,而是使用 __partial_sort(部分排序)。
然后通过__unguarded_partition_pivot,得到一个奇怪的位置(这个函数的翻译是无防护分区枢轴)。
然后递归处理这个奇怪的位置到末位置,再更新末位置,继续循环。
鉴于本人比较好奇无防护分区枢轴是什么,于是先看的__unguarded_partition_pivot。
__unguarded_partition_pivot
首先,找到了中间点。
然后__move_median_to_first(把中间的数移到第一位)。
最后返回__unguarded_partition。
__move_median_to_first
这里的中间数,并不是数列的中间数,而是三个迭代器的中间值。
这三个迭代器分别指向:第二个数,中间的数,最后一个数。
至于为什么取中间的数,暂时还不是很清楚。
`__unguarded_partition`
传参传来的序列第二位到最后。
看着看着,我好像悟了。
这里应该就是实现快速排序的部分。
上边的__move_median_to_first 是为了防止特殊数据卡 [公式] 。经过移动的话,第一个位置就不会是最小值,放在左半序列的数也就不会为 [公式] 。
这样的话,__unguarded_partition 就是快排的主体。
那么,接下来该去看部分排序了。
__partial_sort
这里浅显的理解为堆排序,至于具体实现,在stl_heap.h 里,不属于我们的讨论范围。
(绝对不是因为我懒。)
这样的话,__introsort_loop 就结束了。下一步就要回到 __sort。
__final_insertion_sort
其中某常量为enum { _S_threshold = };。
其中实现的函数有两个:
__insertion_sort
其中的__comp 依然按照默认排序方式 < 来理解。
_GLIBCXX_MOVE_BACKWARD3
进入到_GLIBCXX_MOVE_BACKWARD3,是一个神奇的 #define:
其上就是move_backward:
上边的注释翻译为:
__unguarded_linear_insert
翻译为“无防护线性插入”,应该是指直接插入吧。
当__last 的值比前边元素的值小的时候,就一直进行交换,最后把 __last 放到对应的位置。
__unguarded_insertion_sort
就是直接对区间的每个元素进行插入。
总结
到这里,sort 的源代码就剖完了(除了堆的那部分)。
虽然没怎么看懂,但也理解了,sort 的源码是在快排的基础上,通过堆排序和插入排序来维护时间复杂度的稳定,不至于退化为 [公式] 。
鬼知道我写这么多是为了干嘛……
2024-11-29 20:37416人浏览
2024-11-29 20:202530人浏览
2024-11-29 20:202377人浏览
2024-11-29 19:312770人浏览
2024-11-29 19:061325人浏览
2024-11-29 18:27582人浏览
1.企业有网页后台源代码,如何复制源代码生成一个新的后台?2.web网页代码里哪些需要进行数据库备份?3.常见的Web源码泄漏及其利用企业有网页后台源代码,如何复制源代码生成一个新的后台? 进到老
1.波音737可以远程锁机吗?2.PX4从放弃到精通二):ubuntu18.04配置px4编译环境及mavros环境3.Firmament (FMT) 开源飞控系统4.arduino如何输出一个数组?
1.信贷源码是什么2.贷款计算器源代码谁给我提供下。像这样的3.网贷源代码什么意思4.在线申请小额贷款源码5.什么是手机贷款源码6.贷款借钱平台 小额贷款系统 卡卡贷源码 小额贷款源码 贷款平台开发搭