bool findmaxmumsubarray(float a, int low, int high, float &fmaxmumsum, int &ifrom, int &ito)
if (low == high)
// 分段;
int imid = (low + high) / 2;
// 最大子陣列要麼在left ~ mid, 或 mid + 1 ~ right, 或橫跨mid的 left-right 區間;
int ileftfrom = 0;
int ileftto = 0;
float fleftsum = 0.0;
// 尋找左邊陣列
bool bleftres = findmaxmumsubarray(a, low, imid, fleftsum, ileftfrom, ileftto);
if (!bleftres)
int irightfrom = 0;
int irightto = 0;
float frightsum = 0.0;
// 尋找右邊陣列
bool brightres = findmaxmumsubarray(a, imid + 1, high, frightsum, irightfrom, irightto);
if (!brightres)
int icrossingfrom = 0;
int icrossingto = 0;
// 尋找橫跨mid 的子陣列;
float fcrossingsum = 0.0;
bool bcrossingres = findmaxmumcrossingsubarray(a, low, mid, high, fcrossingsum, icrossingfrom, icrossingto);
if (!bcrossingres)
// 如果左邊的子陣列和最大
if (fleftsum >= frightsum && fleftsum >= fcrossingsum)
// 如果右邊的子陣列和最大
else if (frightsum >= fleftsum && frightsum >= fcrossingsum)
else // 最後必定是中間子陣列最大;
return true;
}// 尋找橫跨mid的最大子陣列;
bool findmaxmumcrossingsubarray(float a, int low, int mid, int high, float &fcrossingsum, int &ifrom, int &ito)
float fcurrentsum = 0.0;
// 從mid 開始求取左邊最大和
float fleftmaxmumsum = -1e7;
for (int i=mid; i>=low; i--) }
// 從mid 開始求取右邊最大和
fcurrentsum = 0.0;
float frightmaxmumsum = 1e-7;
for (int i=mid+1; i<=high; i++) }
// 最大子陣列的和;
fcrossingsum = fleftmaxmumsum + frightmaxmumsum;
return true;
}
// by 我執可破. 2016.11.10 於上海浦東;
演算法導論 尋找最大子陣列
求最大子陣列 include using namespace std struct result structure result structure mid array sum int a,int low,int mid,int high sum 0 result.high index mid 1...
演算法導論 最大子陣列
之前都在準備考試,寒假還是繼續學習。除了家裡打掃衛生,似乎也確實沒什麼事。多看書,多寫 總能提高的。堅持。這次學到了函式返回值可以是乙個結構體,當我們要返回多個值的時候,就可以返回結構體。還有就是對分治法有了更深的認識。include typedef struct op op findmaxcros...
演算法導論2 最大子陣列
最大子陣列問題 假設陣列a low.high 求存在於陣列a中的連續子陣列之和 或陣列中連續元素之和 最大的子陣列,例如a 4 的最大子陣列為a 0 2 和最大為3 2 1 2。如果採用暴力求解的演算法則問題也可以很簡單的求解出來,不過這種方法的時間複雜度為 n 所以寫一下更好的方法。使用分治策略的...