分解:將原問題分解為若干個子問題,子問題為原問題規模較小的問題
解決:遞迴求解子問題,若足夠小,直接求解
合併:將子問題的解合併為原問題的解分解:分解待排序的n個元素的序列成各具n/2個元素的子串行
解決:使用歸併演算法解決兩個子串行的排序
合併:合併兩個已排序的子串行
merge(a,p,q,r) //a代表乙個陣列,pqr分別代表下標(p<=q這裡是歸併過程的偽**,歸併過程作為本演算法的另乙個核心,其**過程也充分體現了排序的過程merge-sort(a,p,r)與遞迴演算法相比較,在n大於30後,歸併演算法有著較為明顯的優勢。他的時間複雜度比遞迴的時間複雜度更低,所以在排序較多資料時,歸併演算法能取得較好的效果!1 if p這裡的總程式運用了遞迴的思想,這樣達到了將程式分解的目的,同時也體現了分治的思想
1const
int maxn= 100;2
const
int max = 100000;3
int * merge(int * &a,int p,int q,intr)4
;6int r[maxn]=;
7int n1=q-p+1;8
int n2=r-q;
9for(int i=0;i)
10 l[i]=a[p+i-1
];11
for(int j=0;j)
12 r[j]=a[q+j];
13 l[n1+1]=max;
14 r[n2+1]=max;
15int a=1,b=1;16
for(int i=p;i)
1723
else
2428}29
return
a;30}31
32void mergesort(int * &a,int p,int
r)33
41 }
遞迴演算法:θ(n) = (n^2)
歸併演算法:θ(n) = (nlgn) //注意,這裡的lgn是log2n的代表
下面我們用一張圖來說明其時間複雜度
假設問題的個數正好是2的n次冪
那麼一層一層分下來
第一層的總代價cn
第二層總代價c(n/2) +c(n/2) = cn
………這樣,每一層的總代價都是cn
那麼一共有lgn層,再加上第一層
所以總代價即為:cn*lgn+cn = θ(nlgn)
ps:即使問題的個數不是2的n次冪,也可使用這樣的演算法,這裡只是為了方便討論和理解
演算法 分治法之歸併排序
一 歸併的思想 是分治演算法的完美體現 步驟一 拆解演算法 a.找出分解點,在此處是是中間點拆分,拆成左右倆個陣列。b.左 右倆個陣列採用同樣的方式拆解,一直迴圈拆,直到拆到乙個元素為止 因為乙個元素本身就是有序的特性 步驟二 合併演算法 利用倆個有序的陣列比較簡單合併的思路,進行合併 二 展示 p...
分治法的基本思想 高階排序演算法 分治法與歸併排序
很多有用的演算法結構上是遞迴的,為了解決乙個特定問題,演算法一次或者多次遞迴呼叫其自身以解決若干子問題。這些演算法典型地遵循分治法的思想 將原問題分解為幾個規模較小但是類似於原問題的子問題,遞迴求解這些子問題,然後再合併這些問題的解來建立原問題的解。分治法在每層遞迴時有三個步驟 現在我們就來看下歸併...
分治法,歸併排序
1.時間複雜度為o nlog n 非降序 package com.cn.insertion 歸併排序,採用分治法的策略 author administrator public class merge sort mergesort a,0,9 for int i 0 i a.length i 先分在和...