2013-04-10 52 views
3

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

我需要排序这个向量。 我想知道哪种排序算法最适合。 我宁愿像就地合并或快速排序算法,因为我不想占用更多的内存(矢量已经是一个巨大的)。

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

所以理想情况下,我更喜欢这种方法,我在大矢量上使用一些准备好的排序算法(因为这会让我感觉更简单)。

回答

2

看看std::inplace_merge。你可以使用mergesort的想法和合并每一对,然后下一对,然后下一个......等等,直到只剩下一个。

0

Timsort看起来就是你所需要的 - 它是一种自适应排序,它在数据中查找预分类运行,并在它们进行合并时进行合并。它具有最差的O(nlog n)性能,并且如果运行(预分类的子阵列)很长,我认为它会做得更好。

1

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

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