分治法与归并排序
2017-12-27 16:41
253 查看
分治法
[b]分治模式[/b]分解: 原问题为若干字问题,这些子问题是原问题的规模较小的实例。
解决: 这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。
合并: 这些子问题的解成原问题的解。
[b]归并排序操作如下[/b]
分解: 分解待排序的那个元素的序列成各具n/2个元素的两个子序列。
解决: 使用归并排序递归地排序两个子序列。
合并: 合并两个已排序的子序列以产生排序的答案。
MERGE_SORT(A,p,r) if p<r q = floor((p+r)/2) MERGE_SORT(A,p,q) MERGE_SORT(A,q+1,r) MERGE(A,p,q,r) MERGE(A,p,q,r) n1 = q-p+1 n2 = r-q let L[1..n1+1] and R[1..n2+1]be new arrays for i = 1 to n1 L[i] = A[p+i-1] for j = 1 to n2 R[j] = A[q+j] L[n1+1] = inf //flag of end L[n2+1] = inf i = 1 j = 1 for k = p to r if L[i]<=R[j] A[k] = L[i] i = i+1 else A[k] = R[j] j = j+1
其中MERGE运行时间为Θ(n)
分析分治算法
假设把原问题分解为a个子问题,每个子问题的规模是原来的1/b。为了求解一个规模为n/b的子问题,需要T(n/b)的时间,所以需要aT(n/b)的时间来求解a个子问题。如果分解问题成子问题需要时间为D(n),合并问题需要的时间为C(n),那么得到递归式:T(n)={Θ(1)aT(n/b)+D(n)+C(n)若n≤c其他
[b]归并排序算法的分析[/b]
分解: 分解步骤仅仅计算子数组的中间位置,需要常量时间,因此D(n)=Θ(1)。
解决: 我们递归地求解两个规模均为n/2的子问题,将贡献2T(n/2)的运行时间。
合并: 在一个具有n个元素上进行MERGE需要Θ(n)的时间,因此C(n)=Θ(n)。
所以归并排序的最坏情况下运行时间T(n)的递归式:
T(n)={Θ(1)2T(n/2)+Θ(n)若n=1若n>1
重写为:
T(n)={c2T(n/2)+cn若n=1若n>1
利用主定理、递归树等方法可以得到最终时间复杂度为T(n)=Θ(nlgn)
python与c++实现稍后补上