Kor*_*icz 23
仅对其他范围排序,然后使用std :: merge.
gal*_*p1n 20
void foo( std::vector<int> & tab, int n ) {
std::sort( begin(tab)+n, end(tab));
std::inplace_merge(begin(tab), begin(tab)+n, end(tab));
}
Run Code Online (Sandbox Code Playgroud)
编辑2
auto it = std::adjacent_find(begin(tab), end(tab), std::greater<int>() );
if (it!=end(tab)) {
it++;
std::sort( it, end(tab));
std::inplace_merge(begin(tab), it, end(tab));
}
Run Code Online (Sandbox Code Playgroud)
最佳解决方案是独立地对尾部进行排序,然后执行就地合并,如此处所述
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.5750
该算法非常复杂,通常被认为"不值得努力".
当然,使用C++,您可以随时使用std::inplace_merge
.但是,该算法的名称极具误导性.首先,不能保证std::inplace_merge
实际就地工作.当它实际就位时,并不能保证它不会被实现为完整的排序.在实践中,它归结为尝试它并看它是否足够好用于你的目的.
但是如果你真的想要就地制作并且正式比完全排序更有效,那么你将不得不手动实现它.STL可能有助于一些实用程序算法,但它没有提供"只需几次调用标准函数"类型的任何可靠解决方案.