分治體現 歸併排序

2021-08-19 22:47:33 字數 1218 閱讀 8979

大開始這個演算法之前,我一定要大大的誇讚我的團隊,讓我從茫然到茅塞頓開,真的是很棒的體驗。演算法真的很有趣,希望經過一段時間的解除,能讓演算法認識我,哈哈!

今天給大家講講分治演算法,其實分支裡面還有遞迴的概念,但是時間有限,今天就不講了,下次講吧。

有位大神告訴我,要想把事情做的有效率,有質量,就要有分治和抽象的思想,那麼到底什麼是分治呢?字面意思:分開治理,此處舉乙個歸併排序的例子吧。

歸併排序 是成功應用分治法的完美例子,基本思想是靜待排序元素分成大小大致相同的另個子序列,分別對著兩個子串行進行排序,最終將排好序的子序進行排序,最終將排好序的子串行合併為所要求的序列

分為三個步驟:

1、分解:經n個元素分成各含n/2個元素的子串行

2、求解:用歸併排序對兩個子串行遞迴的排序

3、合併:合併兩個已經排好的子串行排序得到排序結果

在討論的時候,最讓人興奮的是發現問題,然後和大家激烈討論出結果,這種及時的反饋比中獎還高興。

1、為什麼用l[50],r[50]陣列

2、n1,n2有什麼作用

3、l[n1]=int_max;

r[n2]-int_max;有什麼作用

4、i,j 為什麼從0開始,從1開始不行嗎?

5、合併的時候,兩個已排好序的序列式怎樣排序的,這塊**特別有意思,一定要親手實踐

for(k=p,kdemo

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace 分治法

//歸併排序 是成功應用分治法的完美例子,基本思想是靜待排序元素分成大小大致相同的另個子序列,分別對著兩個子串行進行排序,最終將排好序的子序進行排序,最終將排好序的子串行合併為所要求的序列

void mergesort(int a,int p,int r)

}//函式merge(a,p,q,r)的c **如下:

void merge(int a,int p,int q,int r)

for(j=0,jl[n1]=int_max;

r[n2]-int_max;

i=0;

j=0;

//3、合併:合併兩個已經排好的子序惡劣已得到排序結果

for(k=p,kelse}}

}}

歸併排序(分治)

把乙個陣列 a 分成兩個部分 s,m m 1,e 假設兩部分分別有序,把這兩部分合併到另一陣列中 tmp 保證該陣列有序,然後再把資料 e s 1拷貝回陣列a 分治的原理。把資料無限二分,最後比較兩個數即可。遞迴實現。includeusing namespace std int a 10 int b...

歸併排序 分治

歸併 將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有 序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併的本質 空間換時間,通過申請乙個額外陣列儲存中間變化,從而實現排序 歸併排序核心步驟 歸併排序的特性總結 歸併的缺點在於需要o n 的空間複雜度,歸併排序的思...

分治 歸併排序

將兩個排序好的陣列歸併過程如下 紅色的 1 是左邊起始位置 綠色的 2 是右邊起始位置 灰色的 最右邊 是右邊終點位置 include using namespace std typedef int elementtype l 左邊起始位置,r 右邊起始位置,rightend 右邊終點位置 void...