对std :: vector进行排序,该部分对其进行排序(由排序向量的串联形成)

时间:2013-04-10 12:04:55

标签: c++ algorithm sorting vector std

我有一个std :: vector作为我公开的API的输入之一。 我知道这个API的用户可以发送一个巨大的向量,但该向量是由排序向量的串联形成的。这意味着我得到的矢量是由许多排序的矢量组成的。

我需要对此向量进行排序。 我想知道哪种排序算法最适合。 我更喜欢合并或快速的就地排序算法,因为我不想占用更多内存(向量已经很大)。

最好更改API接口以接受N个已排序的向量,然后自己进行N路合并。除非储蓄真的很大,否则我不想这样做。 另外,在进行N路合并时,我希望尽可能在原地进行。

理想情况下,我更喜欢这种方法,我在大矢量上使用一些现成的排序算法(因为我觉得这样更简单)。

3 个答案:

答案 0 :(得分:2)

看看std::inplace_merge。您可以使用mergesort构思并合并每一对,然后是下一对,然后是下一个......依此类推,直到只剩下一个。

答案 1 :(得分:1)

您可以搜索向量以查找较小向量的连接点。然后通过使用这些迭代器,您可以逐个合并。

要查找连接点,您可以从头开始查找违反排序条件的第一个元素。然后从那个位置到下一个等等。

答案 2 :(得分:0)

Timsort看起来正是你所需要的 - 它是一种自适应排序,它在数据中查找预先排序的运行,并在它们运行时合并它们。它具有最坏情况下的O(nlog n)性能,并且我预计如果运行(预分类子阵列)很长,它会比那更好。