问题
归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k。
解析
归并排序是一个典型的基于分治的递归算法。它不断地将原数组分成大小相等的两个子数组,最终当划分的子数组大小为1时,将划分的有序子数组合并成一个更大的有序数组。
图解如下:
原序列如上图。
开始递归分治。
直到递归到底,开始归并。
排序完成。
设计
分治:
- 把n个元素从中间切开,分成两部分。
- 步骤骤1分成的两部分,再分别进行递归分解。直到所有部分的元素个数都为1。
- 底层开始逐步归并两个有序的数列。
归并: - 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置。
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置。
重复步骤3直到某一指针超出序列尾。
分析
设该算法的最坏时间复杂度为W(n),则递推公式如下:
设n=2k
W(n)=2W(n/2)+n-1=2[2W(n/4)+n/2-1]+n-1=22W(n/4)+2n-1-2
=22[2W(n/8)+n/4-1]+2n-1-2=23W(n/8)+3n-1-2-4=…
=2kW(1)+kn-(1+2+4+…+2k-1)=2kW(1)+kn-(2k-1)
=2kW(1)+kn-2k-1
把W(1)=0和k=logn代入上式得W(n)=nlogn-n+1=O(nlogn)
所以归并排序算法得时间复杂度为O(nlogn)。