演算法導論之尋找最大子陣列

2021-07-24 13:30:38 字數 1730 閱讀 3356

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 所以寫一下更好的方法。使用分治策略的...