合并排序运行时间

时间:2011-05-08 10:30:26

标签: big-o mergesort

我知道合并排序的运行时间是O(n * lg(n)),并且合并排序是比较排序,这也意味着在最坏的情况下需要Ω(n logn)来排序列表

因此,我可以得出结论,合并排序的运行时间是theta(n * lg n)吗?

2 个答案:

答案 0 :(得分:2)

如果有O(X)Omega(X),则表示它是Theta(X)log_b1(...)与转换因子常量的log_b2(...)相同。

你说的是(已翻译):

  

我知道合并排序的运行时间在最坏的情况下不会比n log(n)差。 [你以某种方式用数学得出了这个结论。]但在最坏的情况下,比较排序至少需要n log(n)

因此,合并排序的最坏情况行为恰好是n log(n)

这当然是隐含的假设,即您没有关于序列的信息。

编辑:您也可以从第一原则证明这一点。需要注意的是,您可以在线性Theta(N1 + N2)时间内合并两个已排序的数组,同时保持它们合并(通过扫描它们并行)。 (细分数组,无论你得到什么序列,总是会占用Theta(log(N))时间,这个时间很小,所以我们只是忽略它。)我们现在注意每个元素必须合并Theta(log(N))时间(树的深度,如果你画出来的话)。因此Theta(N log(N))。

答案 1 :(得分:0)

是的,合并排序的复杂性是theta(n * lgn)。还有另一种方法可以确保这一点。

已知合并排序是一种分而治之的算法。首先,它将大小为n的数组分成两个n / 2部分,然后对它们进行递归,最后将结果合并到一个有序数组中。

我们假设合并排序时间是T(n)。然后:
- 除法运算是常数theta(1) - 你只需要通过将它的长度除以2来找到数组的中间元素 - 数组每个部分的递归需要T(n / 2)时间,这两个时间为2T(n / 2) - 已知合并操作具有theta(n)复杂度

所以最后得到以下T(n)=:的循环方程式 theta(1)|如果n == 1
2 * T(n / 2)+ theta(n)|如果n> 1

求解这个等式,得到T(n)= theta(nlgn);

有关详细信息,请参阅Corman的“算法简介”一书。