什么是组合预排序集的最快排序算法

时间:2012-05-09 23:38:40

标签: algorithm sorting dataset complexity-theory

让我们说我知道的集合已经排序,例如{0,2,10,23,65}和{3,5,8 ..}。什么是最好的排序算法,可以将任意数量的预先排序的集合组合成一个有序集合?这种排序效果如何?

3 个答案:

答案 0 :(得分:4)

您不需要排序它们,您需要合并。这是在O(M+N)中使用一个简单的循环完成的,该循环保持两个索引查看两个部分的当前元素,将两个中较小的一个添加到最终序列中,并将索引推进一个。

这是伪代码:

int[] parts1, parts2 // Sorted parts
int i = 0, j = 0;
while i != parts1.Length || j != parts2.Length
    if i != parts1.Length || j != parts2.Length
        if parts1[i] < parts2[j]
            res.Add(parts1[i++])
        else
            res.Add(parts2[j++])
    else if i != parts1.Length
        res.Add(parts1[i++])
    else
        res.Add(parts2[j++])

在每一步中,循环前进ij,执行parts1.Lenght + part2.Length次。

答案 1 :(得分:2)

最简单的方法是比较您拥有的列表的头部,获取最小的列表,并将其添加到有序集合中。重复,直到所有列表都为空。

效率方面,它总是线性的。只需要合并的项目数量就足够了。

这实际上是Mergesort的第二阶段。

答案 2 :(得分:1)

假设O(n)集合中有O(k)个元素。标准合并将为O(n * k)

如果你只有2套,这不是什么大问题。如果你有1000可能。在这种情况下,您可以保留由其下一个最小元素组织的集合的优先级队列。此变体为O(n log(k))