理解和解决K-Way合并排序

时间:2011-10-31 00:41:55

标签: c# java algorithm data-structures

上午

1) 计算k-Way合并排序所需的比较次数,以对从0到N-1的数字的随机排列进行排序。

2)

计算K-Way合并排序所需的数据移动次数o对从0到N-1的数字的随机排列进行排序。

我理解双向合并排序如何正常工作,并且很好地理解代码。我现在的问题是我不知道如何开始并需要一些帮助。 如何将双向合并排序转换为K-Way,以便我可以解决上述问题。

我已经google了一段时间,但找不到任何教程来帮助我理解“k-Way合并排序”。

我需要很好的解释做什么,以便我可以从那里接受并自己做。

就像我说我理解双向,所以我如何移动到K-Way合并排序? 我如何实现K-way。

感谢您的帮助。

修改

**我读过一些帖子 http://bchalk.com/work/view/k_way_merge_sort 必须使用BinaryHeap来实现k-Way合并。是这样还是有其他方式?

**  我如何将我的名单分成K?有一种特殊的方式吗?

2 个答案:

答案 0 :(得分:7)

k > 2时,来自每个输入流的前导元素通常保持在minheap结构中。这样可以很容易地找到n值的最小值,从堆中弹出该值,并从相应的输入流中插入替换值。

堆对每个插入进行O(lg2 k)比较,因此n个项的k-way合并的总工时为n * lg2(k)

尽管你问过C#和Java,你可以通过查看用于k-way合并的Python标准库代码来学习如何做到这一点:http://hg.python.org/cpython/file/2.7/Lib/heapq.py#l323

要回答您的其他问题,没有特殊方法可以将您的列表划分为K个组。只需取第一个数组中的第一个N / k元素,然后将下一个N / k元素放入下一个,等等。对每个数组进行排序,然后使用堆合并它们,如上所述。

答案 1 :(得分:0)

您总是可以将k-way合并视为一系列双向合并,即与第一个和第二个合并的结果进行双向合并,第三个合并:Merge(Merge(L1, L2), L3)和等等。更快的是将它拆分两次:Merge(Merge(L1, L2), Merge(L3, L4))。如您所见,对于k-way排序,您将需要某种循环(递归)。