来自教程:https://time.geekbang.org/column/article/41913
我们对n个元素进行归并排序,需要时间T(n),
那分解成两个子数组排序的时间都是T(n/2)。
merge()函数合并的时间复杂度是O(n)。
归并排序的时间复杂度计算公式是:
T(1) = C; n=1 时,只需要常量级的执行时间,所以表示为 C。
T(n) = 2*T(n/2) + n; n>1
如何求T(n)?
我们对T(n/2)一级一级分解:
T(n) = 2*T(n/2) + n
= 2*(2*T(n/4) + n/2) + n = 4*T(n/4) + 2*n
= 4*(2*T(n/8) + n/4) + 2*n = 8*T(n/8) + 3*n
= 8*(2*T(n/16) + n/8) + 3*n = 16*T(n/16) + 4*n
......
= 2^k * T(n/2^k) + k * n
......
可以看出:
当时,就是最底层,也就是进行了k次之后达到了最底层。
求出,带入T(n)的公式,求出:
,使用大O表示法:T(n) = O(nlogn);
而且归并排序的算法跟有序度无关,所以时间复杂度很稳定都是O(nLogN);