归并排序由约翰·冯·诺伊曼(John Von Neumann)1945年提出,是典型的分治算法(divide conquer algoalgorithm)。
**一、算法描述
算法记为 mergesort(L):
二、算法效率
时间复杂度:用大O记号法表示为 O(nlogn)。
大O记号法:big O notation,是用于描述函数渐进行为的数学符号,更确切地说它是用另一个(通常更简单的)函数来描述一个函数数量级的渐近上界。
一般来说,我们用大O记号法表示的时间复杂度是对最坏情况的描述。
计算过程如下:
假设被排序列表长度为n,记时间频度为T(n),则根据上述算法描述可知:
T(n)=2T(n/2)+n 。
-
T(n/2):将列表L拆分为2个长度为n/2的子列表进行归并排序,每个子列表归并用时为T(n/2);
-
n:将两个子列表进行合并为1个列表最坏情况下需执行n次(时间)。
T(n)T(2n)T(22n)......T(2k−1n)=2∗T(2n)+n=2∗T(22n)+n/2=2∗T(23n)+n/22=2∗T(2kn)+2k−1n(1)
将上述一组等式依次由下往上带入计算可得:
T(n)=2k∗T(2kn)+k∗n(2)
设
n=2k,则等式(2)为:
T(n)=n∗T(1)+n∗log2n(3)
这里,
T(1)=1,故有:
T(n)=n+n∗log2n(4)
显然,
T(n)=O(nlogn)(常简记
log2n为
logn),即: 输入每增大10倍,算法所需时间提高1倍。
三、python实现