有效排序列表串联(STL),合并排序提示,部分排序的方法

时间:2010-11-21 09:47:54

标签: c++ algorithm stl

我有一种情况,我得到一个已经部分排序的值列表。我的最终列表中有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库也没问题。)

虽然我不能轻易分解输入数据,但我当然可以确定子序列的起始位置。

4 个答案:

答案 0 :(得分:7)

您可以尝试std::merge,虽然此算法一次只能合并两个已排序的集合,因此您必须在循环中调用它。另请注意,std::list提供merge作为成员函数。

编辑实际上std::inplace_merge可能是更好的候选人。

答案 1 :(得分:5)

这需要“多路合并”。标准库没有适当的算法。但是,GCC标准库的并行扩展确实:

__gnu_parallel::multiway_merge

答案 2 :(得分:0)

您可以一次迭代所有列表,保留每个列表并为其编制索引。并仅比较该指数中的项目。

这可能比常规排序快得多:O(n)vs O(n * log(n))其中n是所有列表中的项目数。

请参阅wikipedia文章。

C ++有std :: merge,但它不会同时处理多个列表,所以你可能想制作自己的版本。

答案 3 :(得分:0)

如果你可以节省内存,mergesort将会很好地执行此操作。为了获得最佳效果,请一次合并最小的两个链,直到只有一个。