分治法的歸併演算法

2022-03-02 11:22:00 字數 1359 閱讀 3052

分解:將原問題分解為若干個子問題,子問題為原問題規模較小的問題

解決:遞迴求解子問題,若足夠小,直接求解

合併:將子問題的解合併為原問題的解分解:分解待排序的n個元素的序列成各具n/2個元素的子串行

解決:使用歸併演算法解決兩個子串行的排序

合併:合併兩個已排序的子串行

merge(a,p,q,r)	//a代表乙個陣列,pqr分別代表下標(p<=q這裡是歸併過程的偽**,歸併過程作為本演算法的另乙個核心,其**過程也充分體現了排序的過程merge-sort(a,p,r)

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大於30後,歸併演算法有著較為明顯的優勢。他的時間複雜度比遞迴的時間複雜度更低,所以在排序較多資料時,歸併演算法能取得較好的效果!

遞迴演算法:θ(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 先分在和...