目录
一.分而治之二.归并排序性能分析
一.分而治之:
递归算法的复杂度计算方法:
1、代入法
2、递归树法 P50
3、主方法
二.归并排序性能分析:
假设求解规模为n的问题耗时为,当n=1,
。当n>1时,根据分治法按以下步骤对问题进行处理:
- 分解:将规模为n分解为a个规模为
的问题,假设分解耗时为
;
- 求解:求解a个规模为
的问题,则求解这些问题的时间为
;
- 合并:将a个规模为
的问题合并。假设该过程耗时为
。
经过上述处理,可得到:
(1)
在归并法中,分解、求解、合并操作的耗时如下
- 分解:分解操作为
,耗时为常量,则
。
- 求解:归并法中,分解操作是将规模为n的问题分解成2个规模为
的问题,则
;
- 合并:归并法的合并操作的伪代码和耗时如表1所示,其中
,明显可得
。
表1
MERGER(A,p,q,r) 代价 次数
- n1=q-p+1 c1 1
- n2=r-q c2 1
- 新建数组L和R c3 1
- for i=1 to n1 c4 n/2
- L[i]=A[p+i-1] c5 n/2
- for j=1 to n2 c6 n/2
- R[j]=A[q+j] c7 n/2
- L[n1+1]=∞ c8 1
- R[n2+1]=∞ c9 1
- i=1 c10 1
- j=1 c11 1
- for k = p to r c12 n
- if L[i]≤R[j] c13 n
- A[k]=L[i] c14 t
- i = i + 1 c15 t
- else A[k]=R[j] c16 n-t
- j = j + 1 c17 n-t
因此公式1可变成 (2)
公式(2)不断迭代分解后可得:
假设经过k次分解后,达到规模为1的问题,即,所以
,代入上述公式可得
归并排序小结
1.归并排序的时间复杂度为O(nlgn), 空间复杂度为O(n)
2. 归并排序属于稳定排序,即排序前后相等元素的先后顺序不变,这是在O(nlgn)系列算法中(比如快速排序)少有的稳定排序算法
3. 在计算mid = (low + high) / 2时,如果low和high很大,则可能发生溢出,可将式子转换为mid = low + (high - low) / 2
4. 书上伪代码是在每次merge时分配临时空间,这样多次分配释放会影响效率,可以预先分配O(n)的空间作为参数传给merge函数
5. 归并排序可用于外排序。当我们要对一个很大的数据文件排序(文件不能一次装入内存),可以将其分段读入内存排序后写回(或写到临时文件),然后再使用归并算法合并已排序的多个子文件
6. 类似的,如果要合并两个特别大的有序序列,去除重复元素,或者是找出相同元素,也可以采用merge的思想