C++ C++;STL::什么';在位合并和排序之间的区别是什么

C++ C++;STL::什么';在位合并和排序之间的区别是什么,c++,stl,C++,Stl,据我所知,inplace_merge与sort做的事情完全相同,只是它只在某些情况下工作(当容器已经分为两个排序部分时) 换句话说,这两者之间是否有区别: int first[] = {1,3,5,7}; int second[] = {2,4,6,8}; vector<int> v(8); vector<int>::iterator it; copy(first,first+4, v.begin()); copy(second,second+4, v.begin()+4

据我所知,inplace_merge与sort做的事情完全相同,只是它只在某些情况下工作(当容器已经分为两个排序部分时)

换句话说,这两者之间是否有区别:

int first[] = {1,3,5,7};
int second[] = {2,4,6,8};
vector<int> v(8);
vector<int>::iterator it;
copy(first,first+4, v.begin());
copy(second,second+4, v.begin()+4);

inplace_merge(v.begin(), v.begin()+4, v.end())
int first[]={1,3,5,7};
int second[]={2,4,6,8};
向量v(8);
向量::迭代器;
复制(第一,第一+4,v.begin());
复制(第二,第二+4,v.begin()+4);
就地合并(v.begin(),v.begin()+4,v.end())

int first[]={1,3,5,7};
int second[]={2,4,6,8};
向量v(8);
向量::迭代器;
复制(第一,第一+4,v.begin());
复制(第二,第二+4,v.begin()+4);
排序(v.begin(),v.end())
唯一的区别是效率吗?

两个区别:

  • 稳定性
    inplace\u merge
    是一种稳定的算法(它将在子范围内和两个原始范围之间以相同的顺序保持相等的项)。
    因此,在处理非基本类型的容器时,或者在提取排序函数时,结果可能略有不同。 当然,对于
    int
    egers的容器,您不会注意到任何差异:)
  • 效率:正如您所说,鉴于您已经有两个已排序的子集,
    inplace\u merge
    必须以不同的方式实现,因此可能会更有效。这个函数存在的一个事实说明了很多

它们的复杂性不同:

  • 最坏的情况是
    O(N²)
    ,这取决于STL实现使用的排序算法

  • 最坏的情况是
    O(N*log(N))
    ,最好的情况是
    O(N-1)
    ,因此它永远不会比
    sort()
    (输入相同)慢


另外,正如其他人指出的,
inplace\u merge()
is:它保留排序键相同的项目的顺序<代码>排序()不能保证这一点。它的最坏情况复杂性是
O(N*log(N)²)

sort
方法按升序对范围(第一个、最后一个)中的2个排序的元素进行排序
inplace\u search
将两个排序范围(第一、中间)和(中间、最后)合并为一个组合排序范围(第一、最后)



要使
inplace\u merge
有效,必须对两个子范围进行排序(这就是区别)。此外,
inplace\u merge
在理论上是(但在C++中)的,但它需要高效的内存来进行(最后一个-第一个)-1比较,否则它类似于排序(进行O(n log n)比较)。

-1问题是,OP提出的方案是这两种算法中最坏的情况吗?当考虑一个特定的场景时,比较最坏情况的复杂性是没有意义的。@ SubEyS0C0WB0Y不同意,问题似乎更一般,稍后使用场景作为例子,即复杂性并不一定意味着填充,合并永远不会比排序慢,并且这个答案不考虑稳定性。我在这个答案中唯一要说明的是,inplace\u merge是稳定的,而sort(not stable\u sort)在排序方式上是不稳定的。但是你所回答的问题。我应该已经在cplusplus.com上完全阅读了“手册”:)查看98标准,25.3,
sort
具有N个log N比较的平均情况,而
stable\u sort
最多进行N(log N)^2个比较。(脚注建议那些担心最坏情况下性能的人应该使用
稳定排序
部分排序
)这些要求似乎保留在我的C++0x草案中。@David,是的,MSDN也是这么说的。提到了O(N²)的最坏情况,但这取决于算法。-1与Frèdèric的情况相同:在考虑特定场景时,比较算法最坏情况的复杂性是没有意义的,这可能不是任何算法的最坏情况。谢谢,奇怪的是,我仍然得到了-1,我的分数仍然相同(4493)…只是说,…lol“
inplace\u merge
必须以不同的方式实现,因此可能会更有效”。那是错误的。该标准没有对
in place\u merge
强制执行特定的算法,只考虑了算法的底线效应和复杂性。此外,实际上,
排序
可能比
就地合并
更有效。也就是说,
inplace\u merge
sort
具有更好的最坏情况保证,但从统计角度来看,
sort
在大量各种输入上具有更好的性能。但这不是一个标准的保证:重点可能是。@wilhelmtell,我说的“必须”的意思是“必须有东西”。@wilhelmtell:我希望
inplace\u merge
总是比
std::sort
快。该标准并不要求精确的性能(编译器可以添加任意的sleep语句),但由于编译器编写者并非有意编写错误代码,因此
inplace\u merge
的明显实现永远不会比
std::sort
的任何实现更差。
int first[] = {1,3,5,7};
int second[] = {2,4,6,8};
vector<int> v(8);
vector<int>::iterator it;
copy(first,first+4, v.begin());
copy(second,second+4, v.begin()+4);

sort(v.begin(), v.end())