mergesort合并步骤的时间复杂度是多少?

时间:2017-03-04 18:25:22

标签: algorithm sorting mergesort

我知道这个算法的时间复杂度为o(nlogn),但是如果我们只讨论合并步骤,那么这个算法仍然是o(nlogn)吗?或者它减少到o(logn)?我相信第二个是答案,但由于我们仍然需要触摸阵列中的每个元素,我怀疑复杂性仍然相同

干杯!

2 个答案:

答案 0 :(得分:0)

“拆分”步骤采用o(logn),合并采用o(n),只是通过注释实现。

答案 1 :(得分:0)

归并排序的拆分步骤将采用 O(n) 而不是 O(log(n))。 如果我们有split step的runtime函数:

T(n) = 2T(n/2) + O(1)

T(n) 是输入大小 n 的运行时间,2 是新问题的数量,n/2 是每个新问题的大小,O(1) 是将数组分成两半的常数时间。

我们也有基本情况:T(4) = O(1) 和 T(3) = O(1) 。

我们可能会想出(不是很准确):

T(n) = n/2 * O(1) = O(n/2) = O(n)

此外,要了解 Merge step(手指算法)的时间复杂度,我们应该了解子数组的数量。

最坏情况下子阵列的数量具有渐近增长率= O(n/2 + 1) = O(n)。

“手指算法”随着子数组数量的增长线性增长,它会循环遍历每个子数组 O(n),在最坏的情况下,每个子数组需要再循环 2 个次 -> 合并步骤的时间复杂度(手指算法)= O(2n) = O(n)。