合并排序的n个列表

时间:2018-07-18 05:08:04

标签: algorithm sorting

如何解决非常庞大的列表排序问题?

我想我们将列表划分出来,让它们在每个CPU中进行处理,并生成小的排序列表。

但是我们如何合并并生成最终的排序列表?

3 个答案:

答案 0 :(得分:1)

您可以使用priority queu e(基于二进制堆)合并多个排序的列表。

填充队列(current element of list or its index; list id)对。

At every step: 
   extract pair with min element from queue
   add value to result
   get the next element of the same list (if possible)
   insert new pair into queue again

相对于可用内存,您的列表有多大?
有关有用的线索,请从wiki external sorting page

开始

答案 1 :(得分:0)

基本方法应该是创建大小为(n)的最小堆,其中n是巨大列表中已分区排序列表的数量。 二进制堆的每个节点都应表示为index / sorted_list_number和value。 最小堆的顶部节点将指向巨大列表的最小值,而索引将指向其从排序列表的出现,现在最小堆的弹出顶部将其值添加到巨大列表中,并从弹出的索引列表中将新值添加到堆和heapify中再次。 重复执行直到节点完成为止,当列表中的一个或多个列表正在变空时,也要注意堆大小。

答案 2 :(得分:0)

由于问题是您的列表大于内存,因此我想说外部排序是解决方案:

https://en.wikipedia.org/wiki/External_sorting

  1. 假设我们有N个主存储器块,我们可以加载两个列表的N-1个块。将剩余的一个块用作输出缓冲区

  2. 通过比较前元素进行常规合并来合并两个列表。将结果输出到输出缓冲区。

  3. 当缓冲区已满时,将输出写回到辅助存储器。

  4. 重复这些步骤,直到合并所有列表。