合并流数据的排序算法

时间:2015-04-23 08:10:36

标签: algorithm mergesort

我正在阅读以下链接中的合并排序

http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_sorting.aspx

  

合并排序声名鹊起的原因在于它可以轻松修改以便处理   顺序数据,例如来自流或生成器。另一个巨大   好处是,当仔细书写时,合并排序不需要   所有物品都存在。它可以对未知数量的项目进行排序   从流或发电机进来,这是一个非常有用的财产。

我的问题是

1.我的理解是合并排序需要完整的数组,因为我们必须在它们之间划分数组并独立排序然后合并。如果并非所有项都存在,合并排序算法如何工作?

  1. 简单地给出算法如何使用合并排序算法来处理来自流的项目?

2 个答案:

答案 0 :(得分:0)

1和2的答案有些相关。

  1. 您仍然可以使用不完整的数组执行mergesort,这将为您提供已排序的,部分完整的数组。运行时间仍为O(n lg n)。至于插入其余项目,您可以将部分数组与新项目合并,或者一次插入一个新项目,q.v。下面的第2部分。如果原始数组接近完成,则一次插入一个剩余项目将最有效。

  2. 假设您从排序的数字数组开始,当新数字从流中逐个进入时,您不必再运行另一个mergesort。相反,您可以在O(n)时间内遍历已排序的数组,并插入来自流的每个新项目。

答案 1 :(得分:0)

合并排序的工作原理是将列表分成子集,对子集进行排序,然后将它们全部重新组合在一起。如果子集是一个元素长(正在流入的项目)那么它已经被排序并且只需要与现有元素集合一起放入。从技术上讲,我会称之为插入排序。这里的难点在于确定新元素的放置位置。您可以使用一个数组,这使得找到正确的位置非常容易,但添加新项目需要移动数据以腾出空间(有时重新分配数组)。或者,您可以将数据存储为链接列表,因此添加项目很简单,但确定放置新项目的位置比较棘手。秋千和环形交叉路口。

相关问题