子程式直接呼叫自己或通過一系列條用語句間接呼叫自己。分治和遞迴經常同時應用於演算法設計之中,並由此產生許多高校的演算法。分解--》求解--》合併
時間複雜度:o(nlogn)
#include "mergesort.h"
#includevoid mergesort(int a,int p,int r)
if((right=(int*)malloc((n2+1)*sizeof(int)))==null)
//複製陣列
for(i=0; i
注意是子段肯定是連續的不能跳躍,(-2,11,-4,13,-5,-2)時,子段為最大子段,和為20。
第一種情況: 計算 left 到 center 的最大和,記作 leftsum
第二種情況: 計算從 center+1 到 right的最大和,記作 rightsum
第三種情況: 跨邊界的和。以center為中心分別向兩邊計算和。
a.從 center出發,每次向左邊擴張一步,並且記錄當前的值s1,如果當前的和比上次的和大,就更新s1,一 直向左擴張到 位置 left。
b.從 center+1出發,每次擴張一步,計算當前的和 為s2,如果當前的值比上次的和 大,那麼,就更新s2的 值,一直向右擴張到位置right。
c.計算過center的連續值的和,s1+s2的值 sum。 這個就是跨邊界的和。
上面三種情況考慮計算完成後,最後一步就是,比較三個值中的最大值,取最大值就可以了。
---參考
#include/*求解最大子段*/
int maxsubsum(int *array,int left,int right)
else
}else
}int s2=0;
int rights=0;
for(i=center; i<=rights; i++)//右邊的數向右蔓延相加求和
}sum=s1+s2;//過center的值
if(sum
演算法 分治法之歸併排序
一 歸併的思想 是分治演算法的完美體現 步驟一 拆解演算法 a.找出分解點,在此處是是中間點拆分,拆成左右倆個陣列。b.左 右倆個陣列採用同樣的方式拆解,一直迴圈拆,直到拆到乙個元素為止 因為乙個元素本身就是有序的特性 步驟二 合併演算法 利用倆個有序的陣列比較簡單合併的思路,進行合併 二 展示 p...
分治法之歸併排序
參考學習的地方 在演算法設計中,如果對遞迴過程只有 模型的認識而沒有清晰的實踐的認識,最佳實踐就是在給每一層的遍歷新增乙個輸出,這樣就 可以驗證並把握遞迴的實質了。拓展 這種學習思想可用於專案中的測試,以及其他高 大難問題的分解驗證。歸併排序 難點是merge函式的設計 簡化就是用乙個陣列接收比較結...
分治法之歸併排序(遞迴 分治)
歸併排序 思想 1.分而治之,將乙個無序的數列一直一分為二,直到分到序列中只有乙個數的時候,這個序列肯定是有序的,因為只有乙個數,然後將兩個只含有乙個數字的序列合併為含有兩個數字的有序序列,這樣一直進行下去,最後就變成了乙個大的有序數列 2.遞迴的結束條件是分到最小的序列只有乙個數字的時候 時間複雜...