对一个已排序的std::vector进行排序(由已排序的vector拼接而成)

Sorting a std::vector which has parts of it sorted (formed by concatenation of sorted vectors)

本文关键字:排序 vector 拼接 std 一个      更新时间:2023-10-16

我有一个std::vector作为我所公开的API的输入之一。我知道这个API的用户可以发送一个巨大的向量,但是这个向量是由排序的向量拼接而成的。这意味着我得到的向量是由一些排序的向量组成的。

我需要对这个向量排序。我想知道哪种排序算法最适合。我更喜欢像merge或quick这样的就地排序算法,因为我不想占用更多的内存(向量已经很大了)。

也会更好地改变API接口接受N排序向量,然后做N-way合并我自己。我不想这么做,除非省下的钱真的很大。同时,在做n向归并时,如果可能的话,我想在适当的地方做。

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

看看std::inplace_merge。您可以使用归并排序的想法,并合并每一对,然后下一对,然后下一个…等等,直到只剩下一个。

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

要查找连接点,您可以从一开始就查找违反排序标准的第一个元素。然后从这个位置到下一个位置等等

Timsort看起来正是您所需要的——它是一种自适应排序,可以在数据中查找预先排序的运行,并在运行时合并它们。最坏情况下它的性能为0 (nlog n),我希望如果运行(预排序的子数组)很长,它的性能会好得多。