对一个已排序的std::vector进行排序(由已排序的vector拼接而成)
Sorting a std::vector which has parts of it sorted (formed by concatenation of sorted vectors)
我有一个std::vector作为我所公开的API的输入之一。我知道这个API的用户可以发送一个巨大的向量,但是这个向量是由排序的向量拼接而成的。这意味着我得到的向量是由一些排序的向量组成的。
我需要对这个向量排序。我想知道哪种排序算法最适合。我更喜欢像merge或quick这样的就地排序算法,因为我不想占用更多的内存(向量已经很大了)。
也会更好地改变API接口接受N排序向量,然后做N-way合并我自己。我不想这么做,除非省下的钱真的很大。同时,在做n向归并时,如果可能的话,我想在适当的地方做。
所以理想情况下,我更喜欢在大向量上使用一些现成的排序算法的方法(因为我觉得这会更简单)。
看看std::inplace_merge。您可以使用归并排序的想法,并合并每一对,然后下一对,然后下一个…等等,直到只剩下一个。
您可以搜索向量以查找较小向量的连接点。然后,通过使用这些迭代器,您可以逐一进行合并。
要查找连接点,您可以从一开始就查找违反排序标准的第一个元素。然后从这个位置到下一个位置等等
Timsort看起来正是您所需要的——它是一种自适应排序,可以在数据中查找预先排序的运行,并在运行时合并它们。最坏情况下它的性能为0 (nlog n),我希望如果运行(预排序的子数组)很长,它的性能会好得多。
相关文章:
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 使用 std::vector C++快速排序,EXC_BAD_ACCESS代码 2
- std::vector 未按 std::sort 的预期排序
- 如何对忽略某些数字的 std::vector 进行排序?
- 无法使用带有常量引用的 lambda 对 std::vector 进行排序
- 排序时在空 std::vector 上使用 insert()
- 将整数分配给 std::vector 中排序的唯一元素
- <vector> 搞砸了我的快速排序
- 如何在std::vector中只对子集进行排序
- 将多维std::vector排序为单个向量
- 如何从未排序的 std::vector 中删除重复项,同时使用算法保持原始排序
- std::sort 无法对 std::vector<std::string 的元素进行排序>
- C++ - 排序 std::vector 中元素的索引
- 我哪种情况会比排序的std::><vector<std:std::p air<A,B>>更快?
- 重新排序 vector<std::unique_ptr<X>>给定一个 vector<const X*>
- 按排序顺序迭代 std::vector
- 以排序方式迭代 std::vector<std::p air<T,U> > 对象
- 获取排序后的std::vector中满足某个条件的范围
- 是否有任何函数可以对 std::vector< cv::P oint2f> 向量进行排序
- 如何排序vector
>