Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::sort()中使用哪种类型的排序?_C++_Sorting_Stl - Fatal编程技术网

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); } }