【发布时间】:2014-03-02 18:33:39
【问题描述】:
考虑N元素中的std::vectorv,并认为n的第一个元素已经用n < N排序,而(N-n)/N非常小:
有没有比使用完整的std::sort(std::begin(v), std::end(v)) 更快地使用 STL 算法对这个向量进行排序的聪明方法?
编辑:澄清:(N-n)个未排序的元素应插入已排序的第一个元素内的正确位置。
EDIT2:额外问题:以及如何找到 n ? (对应于第一个未排序的元素)
【问题讨论】:
-
EDIT2 的答案是
std::is_sorted_until -
就地执行是否是一项要求?好像是隐含的,你却没有明说。
-
如果
N-m很小,那么可以使用插入排序。是的,它被认为是一种糟糕的排序算法,但事实是当输入几乎排序时它是有效的。或者,如果您可以节省一些额外的内存,您可以将未排序的元素移动到不同的向量中,对其进行排序并进行合并排序,在这种情况下,您可能希望从末尾而不是开头进行排序。 -
std::sort 有什么问题?您不必为起始元素提供迭代器。您不妨提供第 200 个元素的迭代器(如
vec.begin() + 199) -
C++ 标准库没有一些可用的自适应排序算法? (例如 timsort)否则您可以使用它们对整个数组进行排序,算法将自动避免在第一部分浪费时间。
标签: c++ algorithm sorting c++11 vector