您的位置:首页 > 其它

分治法与归并排序

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++实现稍后补上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序