使用合并过程对小数组进行插入排序:

时间:2018-03-29 10:39:10

标签: algorithm sorting merge

考虑问题:

虽然合并排序在Θ(nlgn)最坏情况下运行,插入排序在Θ(n^2)最坏情况下运行 时间,插入排序中的常数因素使得小n的速度更快。因此,当子问题变得足够小时,在合并排序中使用插入排序是有意义的。 考虑对合并排序进行修改,其中n/k长度为k的子列表使用插入排序进行排序,然后使用标准合并机制进行合并,其中k是要确定的值。

问题:显示可以在Θ(n lg(n/k))最坏情况时间合并子列表:

我的解决方案:

要将n/k个子列表合并到n/2k,需要Θ(n)

要将n/2k个子列表合并到n/4k,需要Θ(n)

...

要将2个子列表合并为1,需要Θ(n)

然后我正在努力采取进一步措施,我看了解决方案:

我们有 lg(n/k)此类合并 ,因此将n/k个子列表合并到一个列表中需要Θ(n lg(n/k))最坏情况时间。< / p>

我有两个问题:

1)他们如何以 lg(n/k)合并 结束?请澄清一下计算?

2)为什么最终结果 Θ(n lg(n/k))

1 个答案:

答案 0 :(得分:1)

你似乎非常接近实际答案。我相信你所查找的答案的措辞是让你更难理解的原因,因为我不认为所需的单个合并总数是lg(n/k)。我认为答案所指的是在我们最终得到排序列表之前所需的合并步骤的数量。

然而,不是回答,让我们继续建立你的推理。合并两个长度为k的列表的时间复杂度为O(k)。要将n/k个此类列表合并到n/(2k)列表中,我们会n/(2k)合并每个复杂度O(k),导致整体O(n)复杂度,如您所述。

您可以将此逻辑扩展到下一个步骤,其中n/(2k)列表合并到n/(4k),并声明第二步具有O(n)复杂度,同样。实际上,每次合并步骤,都需要O(n)次。

接下来要做的就是估算这些合并步骤的数量。我们从n/k列表开始,在第一步之后我们获得了n/(2k)个列表。之后,在每一步,列表数量减半,直到只剩下一个列表,这将是我们的结果。 (即排序清单)那么,您认为我们必须将n/k除以2,直到我们最终得到1?这正是log(n/k)的含义,不是吗?因此,将会有log(n/k)个此类合并步骤,每个步骤都需要O(n)

因此,整个过程的时间复杂度为O(nlog(n/k))