上午
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?有一种特殊的方式吗?
答案 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排序,您将需要某种循环(递归)。