我正试图想出一个分而治之的算法来合并j个排序列表和n个元素,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望合并算法更高效,如下所示:
合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表合并,以此类推,该列表取O(j*jn)。
这与标准的合并排序没有什么不同。考虑一个带有未排序项的sizejn
列表。在log(n)
对sizejn
项列表进行合并排序迭代后,您将拥有在每个列表中具有n
项的j
排序列表。所以继续使用合并排序来解决您的问题。
请查阅合并排序,这是一种分治算法,并理解它。这样你就能很容易地解决这个问题了。
不知道为什么你需要分而治之来实现这一点。您只需创建一个无序的大列表,然后使用内置排序对大列表进行排序,它将是O(jn*Log(jn))
List<int> returnList(List<List<int>> lists)
{
List<int> ret = new List<int>();
for(int i=0;i<lists.Length;i++)
{
for(int j=0;j<lists;j++)
{
ret.Add(lists[i][j]);
}
}
ret.Sort();
}
你可以在O(j*log(j)n)时间内完成
while(n!=1)
for i=0 to n/2
merge list(i) with list list(n)
n = n/2
这样你就可以把整个团队合并成一对,然后再合并成一对对,依此类推
双向合并排序与递归合并排序有何不同? 假设在合并排序中有5个数字需要排序8,9,1,6,4,我们按如下步骤1进行划分:{8,9,1}{6,4} 步骤2:{8,9}{1}{6}{4} 步骤3:{8}{9}{1}{6}{4} 现在合并 步骤4:{8,9}{1}{4,6} 步骤5:{1,8,9}{4,6} 第六步:{1,4,6,8,9} 但在双向合并排序中,我们将数组分为两个元素(但根据维基百科,在合并
本文向大家介绍合并排序,包括了合并排序的使用技巧和注意事项,需要的朋友参考一下 合并排序技术基于分而治之。我们将整个数据集分成较小的部分,然后按排序顺序将它们合并成较大的部分。在最坏情况下它也非常有效,因为该算法在最坏情况下的时间复杂度也较低。 合并排序技术的复杂性 时间复杂度: 所有情况下为O(n log n) 空间复杂度: O(n) 输入输出 算法 合并(数组,左,中,右) 输入- 数据集数
我收到一份作业,要求我将总共有N个元素的K个排序列表有效地合并到一个排序列表中。我偶然发现的方法是使用最小堆对K列表中的元素进行排序,或者使用分而治之的方法(成对合并)。该线程中的注释表明,分而治之方法的时间复杂度为O(NK),而最小堆方法的时间复杂度为O(N log K),两者的空间复杂度相同。我还访问了许多其他线程,但我不能得到一个清晰的图片。 怀疑 许多其他网站告诉我们,两者都存在分歧
本文向大家介绍Haskell合并排序,包括了Haskell合并排序的使用技巧和注意事项,需要的朋友参考一下 示例 有序合并两个有序列表 保留重复项: 自顶向下版本: 定义这种方式是为了清楚而非效率。 使用示例: 结果: 自下而上的版本:
这不是经典的“合并两个排序”列表问题,这在线性时间内是相当微不足道的。 我想做的是合并两个对的列表,它们已经按排序,其中两个列表中都有具有相同的对象:这些对象应该合并(添加)它们的
我试图借助单链表编写合并排序,节点定义如下, 合并排序的工作方式如下: i、 将未排序的列表划分为n个子列表,每个子列表包含1个元素(1个元素的列表被视为已排序)。 二、。重复合并子列表以生成新排序的子列表,直到只剩下1个子列表。这将是排序列表。代码如下所示。 我像这样打入会电话, 结果是,所有负值似乎都消失了。这里有什么问题?