是否有替代插入然后排序

Jon*_*Mee 4 c++ sorting merge insert stl-algorithm

如果我有,vector<int> foo并且vector<int> bar两者都已排序,并且我想将它们合并为foo最终结果已排序,那么标准是否为我提供了这样做的方法?

显然我可以这样做:

foo.insert(foo.end(), bar.begin(), bar.end());
sort(foo.begin(), foo.end());
Run Code Online (Sandbox Code Playgroud)

但我希望有一个步骤算法来实现这一目标.

Tob*_*obi 6

要详细说明Mat的注释,您的代码可能看起来像这样使用std::merge:

std::vector<int> result;
std::merge(
    foo.begin(), foo.end(),
    bar.begin(), bar.end(),
    std::back_inserter(result));

foo = result; // if desired
Run Code Online (Sandbox Code Playgroud)

  • 它的复杂性较低,尽管不是一步到位.最后一部分可能是一个移动,可能使它成为你可以为此设计的最快的算法. (6认同)

Bla*_*ace 6

使用它可能更快std::inplace_merge而不是std::sort.如果有额外的可用内存,则它具有线性复杂性,否则会回退到NlogN.

auto middle = foo.insert(foo.end(), bar.begin(), bar.end());
std::inplace_merge(foo.begin(), middle, foo.end());
Run Code Online (Sandbox Code Playgroud)

  • 我赞成,但让我们清楚,在引擎盖下,`std :: inplace_merge()`与TobiMcNamobi的代码完全相同(假设有足够的内存可用),所以如果OP对该解决方案不满意,他真的应该对这个同样不满意. (3认同)