大開始這個演算法之前,我一定要大大的誇讚我的團隊,讓我從茫然到茅塞頓開,真的是很棒的體驗。演算法真的很有趣,希望經過一段時間的解除,能讓演算法認識我,哈哈!
今天給大家講講分治演算法,其實分支裡面還有遞迴的概念,但是時間有限,今天就不講了,下次講吧。
有位大神告訴我,要想把事情做的有效率,有質量,就要有分治和抽象的思想,那麼到底什麼是分治呢?字面意思:分開治理,此處舉乙個歸併排序的例子吧。
歸併排序 是成功應用分治法的完美例子,基本思想是靜待排序元素分成大小大致相同的另個子序列,分別對著兩個子串行進行排序,最終將排好序的子序進行排序,最終將排好序的子串行合併為所要求的序列
分為三個步驟:
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...