让我们说我知道的集合已经排序,例如{0,2,10,23,65}和{3,5,8 ..}。什么是最好的排序算法,可以将任意数量的预先排序的集合组合成一个有序集合?这种排序效果如何?
答案 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++])
在每一步中,循环前进i
或j
,执行parts1.Lenght + part2.Length
次。
答案 1 :(得分:2)
最简单的方法是比较您拥有的列表的头部,获取最小的列表,并将其添加到有序集合中。重复,直到所有列表都为空。
效率方面,它总是线性的。只需要合并的项目数量就足够了。
这实际上是Mergesort的第二阶段。
答案 2 :(得分:1)
假设O(n)
集合中有O(k)
个元素。标准合并将为O(n * k)
。
如果你只有2套,这不是什么大问题。如果你有1000可能。在这种情况下,您可以保留由其下一个最小元素组织的集合的优先级队列。此变体为O(n log(k))
。