C ++ STL :: inplace_merge和sort之间的区别是什么

时间:2010-10-20 09:02:32

标签: 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(v.begin(), v.begin()+4, v.end())

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())

唯一的区别是效率吗?

3 个答案:

答案 0 :(得分:9)

它们的复杂性并不相同:

  • sort()的情况最差为O(N²),具体取决于您的STL实施所使用的排序算法。

  • inplace_merge()的最差情况为O(N*log(N)),最佳情况为O(N-1),因此它永远不会慢于sort()(使用相同的输入)

另外,正如其他人所指出的,inplace_merge()stable:它保留了排序键相同的项目的排序。 sort()并不能保证这一点。 stable_sort()确实如此,其最坏情况的复杂性为O(N*log(N)²)

答案 1 :(得分:5)

两个不同之处:

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

答案 2 :(得分:3)

sort方法按升序对范围(第一个最后)中的2个已排序元素进行排序。
inplace_search将2个排序范围(第一个中间)和(中间,最后一个)合并为一个组合排序范围( first 最后)。


要使inplace_merge有效,必须对必须的2个子范围进行排序(这就是差异)。另外,inplace_merge理论上是unstable,(但在C ++中是stable)但它需要有效的内存(最后 - 第一) - 1比较,否则它类似于sort(它做O( n log n)比较)。