C++ std::sort()中使用哪种类型的排序?
有谁能告诉我在C++ std::sort()中使用哪种类型的排序?,c++,sorting,stl,C++,Sorting,Stl,有谁能告诉我在头文件中定义的std::sort()函数中实现了哪种类型的排序技术(冒泡、插入、选择、快速、合并、计数…)大多数std::sort的实现都使用快速排序,(或者通常是一种混合算法,如introsort,它结合了快速排序、堆排序和插入排序) 该标准唯一需要的是std::sort以某种方式按照指定的顺序对数据进行排序,复杂度约为O(N log(N));它不能保证稳定。从技术上讲,introsort比quicksort更能满足复杂性要求,因为quicksort具有二次最坏情况时间。你是指s
头文件中定义的std::sort()函数中实现了哪种类型的排序技术(冒泡、插入、选择、快速、合并、计数…)
大多数std::sort
的实现都使用快速排序,(或者通常是一种混合算法,如introsort,它结合了快速排序、堆排序和插入排序)
该标准唯一需要的是
std::sort
以某种方式按照指定的顺序对数据进行排序,复杂度约为O(N log(N));它不能保证稳定。从技术上讲,introsort比quicksort更能满足复杂性要求,因为quicksort具有二次最坏情况时间。你是指std::sort吗?如果是这样,它可以以任何方式实现。它可能是快速排序,但可以是基数或其他。只要它生成一个排序列表,我就可以n至少O(n log n)该实现很好,可以。C++标准ISO/IEC 14882:2003
25.3.1.1排序
template<class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
模板
无效排序(首先是RandomAccessIterator,最后是RandomAccessIterator);
模板
无效排序(首先是RandomAccessIterator,最后是RandomAccessIterator,
比较comp);
1效果:对
范围[第一,最后)
2复杂性:
大约N log N(其中N==最后一个
-第一)平均比较
没有关于方法的信息,但复杂性总是
N log N
只是一些经验结果:
< P>我使用Std::Road(VS2008工具链)将Nopy1.1.2排序转换为C++的Python脚本。
我在Python和C++边得到的结果是相同的,当我使用Nypy.Stand参数类型=“合并EsSeRT”时,对于相同的元素,当Oy=“QueQuase'或Orth= HeAPTrase'时,我得到不同的相对排序。所以我猜至少对于VS2008 STD来的STL版本::排序使用GysRoR.< /P> < P>有三种算法在MSVC2013 STL中使用at,参考
std::sort
的源代码
它最有可能使用快速排序
,或快速排序
的变体,称为内部排序
如果递归太深,这里将使用HeapSort
否则将使用InsertSort
可能是所有的实现代码> STD::排序< /COD>使用内省排序(AKA自检排序),一种结合QuaskS排序和HeopRoad的混合算法。实际上,在1997中特别发明了InSo排序,目的是在C++ STL中执行性能排序。 标准唯一要求的是
std::sort
以某种方式按照指定的顺序对数据进行排序,复杂度为O(N log(N));不能保证数据是稳定的(如果需要,可以使用单独的std::stable_sort
算法)
从技术上讲,introsort比quicksort更好地满足复杂性要求:这是因为heapsort在最坏情况下保证了O(N log(N))复杂性,而quicksort在最坏情况下有二次时间
但是,在一般情况下,heapsort比quicksort“慢”,因为heapsort执行C*N log(N),而quicksort具有D*N log(N)性能,其中D明显小于C(数字C和D是常量)。换句话说,heapsort的每次比较开销高于quicksort
为了两全其美,introsort从quicksort(一种递归算法)开始,但当递归深度过高时(这意味着它会陷入退化的最坏情况行为),它会切换到heapsort
另请参见David Musser的或,他专门为STL发明了introsort。GCC 9.2.0 libstdc++源代码确认introsort
template<class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);
template<class RandomAccessIterator, class Compare>
void sort(RandomAccessIterator first, RandomAccessIterator last,
Compare comp);
其他,但这里有一些证据证明LIPSTC++是大多数Linux发行版的默认C++实现。 libstdc++是GCC本身的一部分,因此我们将研究GCC源代码
是主标题,包含:#include <bits/stl_algobase.h>
#include <bits/stl_algo.h>
我将在这里停止,我们已经找到了一个名为std::\uuuu introsort\u loop
的标识符,其余的实现都在同一个文件中,如果还有人怀疑的话
还可以将GDB单步调试到std::sort
,而无需在Ubuntu 18.04中进行任何进一步设置,如std::set
中所述:
C++17并行排序
我们现在也有了并行排序,因此值得一看它是如何完成的:
正如上面的回答中提到的,实现依赖于外部库:英特尔线程构建块:不是您的问题,但它在这里说:这是nlogn平均值和n^2最坏情况(这与快速排序相同)。MSVC帮助还指出,“排序复杂度的平均值是O(n log n),其中n=\u Last–\u First。”顺便说一句——c标准库函数
sort()
的答案是一样的:在O(N log N)
上运行的函数。有时,该手册页会告诉您系统实际使用的是什么。还有一个复杂性要求,算法是O(N log N)。这不是很大的限制,因为几乎所有常见的排序都满足此要求。Is确实阻止使用Bogo sort()。我认为不允许使用基数排序(即使它可能对某些数据类型有效),因为它没有对数复杂性,因为它不基于比较。哦,对吗?如果它使用了O(1)这也违反了规则?(忽略这种算法的不可能性)。@Goz不,O(1)实现就可以了。要求是复杂度的上限。它们通常被设置为最有效的已知实现,但不排除某些新的数据结构或更有效的算法。 template<typename _RandomAccessIterator, typename _Compare>
inline void
__sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
_Compare __comp)
{
if (__first != __last)
{
std::__introsort_loop(__first, __last,
std::__lg(__last - __first) * 2,
__comp);
std::__final_insertion_sort(__first, __last, __comp);
}
}