我有一种情况,我得到一个已经部分排序的值列表。我的最终列表中有N个块,每个块都已排序。所以我最终得到了这样的数据列表(斜杠只是强调):
1 2 3 4 5 6 7 8 / 1 2 3 4 5 / 2 3 4 5 6 7 8 9 / 1 2 3 4
我将这些作为一系列指向对象的指针放在向量中。目前我只使用std::sort
和自定义比较器进行排序。我猜这是次优的,因为我的序列是一些退化的情况。
是否还有其他stl函数,提示或其他方法可用于提供最佳类型的此类数据? (Boost库也没问题。)
虽然我不能轻易分解输入数据,但我当然可以确定子序列的起始位置。
答案 0 :(得分:7)
您可以尝试std::merge
,虽然此算法一次只能合并两个已排序的集合,因此您必须在循环中调用它。另请注意,std::list
提供merge
作为成员函数。
编辑实际上std::inplace_merge
可能是更好的候选人。
答案 1 :(得分:5)
这需要“多路合并”。标准库没有适当的算法。但是,GCC标准库的并行扩展确实:
答案 2 :(得分:0)
您可以一次迭代所有列表,保留每个列表并为其编制索引。并仅比较该指数中的项目。
这可能比常规排序快得多:O(n)vs O(n * log(n))其中n是所有列表中的项目数。
请参阅wikipedia文章。
C ++有std :: merge,但它不会同时处理多个列表,所以你可能想制作自己的版本。
答案 3 :(得分:0)
如果你可以节省内存,mergesort将会很好地执行此操作。为了获得最佳效果,请一次合并最小的两个链,直到只有一个。