排序有序链表的集合

时间:2008-10-02 12:56:33

标签: language-agnostic sorting linked-list

我正在寻找针对以下问题的优雅,高性能解决方案。

共有256个链接列表。

  • 每个列表包含相同类型的对象,其中包含用于定义排序顺序的整数。
  • 所有列表中的所有数字都是唯一的
  • 每个单独的列表按这些数字按升序排序

如何从256个原始链接列表中的所有对象创建单个升序有序列表?我不想暴力破解它,并且还有一些其他的想法,但这似乎是那些有标准的,最佳的解决方案的问题之一。

4 个答案:

答案 0 :(得分:3)

您可以使用一个优先级队列来保存256个链接列表中每个列表的“最顶层”项目。这个“最顶层”项是计划插入结果列表的项。这样,您可以从优先级队列中取出最小的元素,将其插入到生成的队列中,然后将其下一个元素插入到优先级队列中:

# Preprocessing:
result = list.new()
queue = priority_queue.new()

foreach (list in lists):
    queue.push(list.first())

# Main loop:
while (not queue.empty()):
    node = queue.pop()
    result.insert(node)
    if (node.next() != null):
        queue.push(node.next())

答案 1 :(得分:1)

如果各个列表已经排序,那么它就是merge algorithm的直接应用。简而言之:比较所有的头并选择最小的头,将其从列表中取出并推入输出列表。重复,直到所有源列表都为空。

编辑:Konrad使用优先级队列(heap)是一个更加优雅和可扩展的解决方案,但可能256个输入列表很少,简单的比较可能更快。

答案 2 :(得分:0)

将每个列表与其上方的列表128合并。 (产生128个清单)
然后将每个列表与其上方的列表64合并。 (产生64个清单)
然后将每个列表与其上方的列表32合并。 (产生32个清单)
然后将每个列表与其上方的列表16合并。 (产生16个清单)
然后将每个列表与其上方的列表8合并。 (产生8个清单)
然后将每个列表与其上方的列表4合并。 (产生4个清单)
然后将每个列表与其上方的列表2合并。 (产生2个清单)
然后将每个列表与其上方的列表1合并。 (产生1个清单)
(您可以使用上面的循环)。

答案 3 :(得分:0)

你没有说这些列表有多长,但我认为它们同时适合RAM。我要尝试的第一件事是将它们全部附加在一起,并调用我的环境的内置排序例程,我会看到它是否提供了可接受的性能。它易于实现,不需要很长时间来测试。如果这不能提供可接受的性能,我将使用Konrad Rudolph给出的优先级队列合并。