我有一个std :: vector作为我公开的API的输入之一。 我知道这个API的用户可以发送一个巨大的向量,但该向量是由排序向量的串联形成的。这意味着我得到的矢量是由许多排序的矢量组成的。
我需要对此向量进行排序。 我想知道哪种排序算法最适合。 我更喜欢合并或快速的就地排序算法,因为我不想占用更多内存(向量已经很大)。
最好更改API接口以接受N个已排序的向量,然后自己进行N路合并。除非储蓄真的很大,否则我不想这样做。 另外,在进行N路合并时,我希望尽可能在原地进行。
理想情况下,我更喜欢这种方法,我在大矢量上使用一些现成的排序算法(因为我觉得这样更简单)。
答案 0 :(得分:2)
看看std::inplace_merge。您可以使用mergesort构思并合并每一对,然后是下一对,然后是下一个......依此类推,直到只剩下一个。
答案 1 :(得分:1)
您可以搜索向量以查找较小向量的连接点。然后通过使用这些迭代器,您可以逐个合并。
要查找连接点,您可以从头开始查找违反排序条件的第一个元素。然后从那个位置到下一个等等。
答案 2 :(得分:0)
Timsort看起来正是你所需要的 - 它是一种自适应排序,它在数据中查找预先排序的运行,并在它们运行时合并它们。它具有最坏情况下的O(nlog n)性能,并且我预计如果运行(预分类子阵列)很长,它会比那更好。