// 尋找最大子陣列-遞迴.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//遞迴法尋找最大子陣列
#include #include #include#include using namespace std;
//函式只可以return乙個值,如果想返回多值,可以
///1:使用結構 struct
/*struct result
*////2:輸出引數
/*int operation(int a,int b,int &sub)
*///尋找最大的跨越中點的子陣列sub_array
//思路:從中點mid開始,往左邊依次找,乙個最大的子陣列max_left
// 往右邊依次找,乙個最大的子陣列max_right
// 把兩個數組合起來,就是穿越中點的最大子陣列max_sum
int find_max_crossing_subarray(int* a, int low, int mid, int high, int& max_left, int& max_right, int& max_sum)
} int right_sum = -99999;
int sum2 = 0;
//int max_right = 0;
for (int j = mid + 1; j <= high; j++) //從mid往右找 }
max_sum = left_sum + right_sum;
return 0;
}//找乙個不穿越中點的子陣列
//拆分至只有乙個元素,遞迴結束條件,此時最大陣列即為他自己
int find_max_subarray(int a, int low, int high, int& max_left, int& max_right, int& max_sum)
else
else if (right_sum >= left_sum && right_sum >= cross_sum)//判斷右邊是否大於中間和左邊
else //中間最大
}}int main()
; int left_array;
int right_array;
int sub_array_sum;
int min = 0;
int max = n - 1;
int array_sum = 0;
for (int i = 0; i < n; i++)
cout << "陣列總和為: " << array_sum << endl;
cout << endl;
find_max_subarray(array, min, max, left_array, right_array, sub_array_sum);
for (int i = left_array; i <= right_array; i++)
cout << endl;
cout << left_array + 1 << "," << right_array + 1 << "," << sub_array_sum << endl;
dword end_time = gettickcount64();//結束時間
cout << "the run time is : " << (end_time - start_time) << "ms!" << endl;
return 0;
}
Java分治法實現最大子陣列
尋找陣列a的和最大的非空連續子陣列。例如 陣列 a 的和最大的連續子陣列為,最大和為43,所以就是a的最大子陣列 陣列的最大子陣列為。採用分治策略 將陣列分為兩個規模相等的子陣列,分別求子陣列的最大子陣列,以及跨越中點的最大子陣列,然後將左子陣列 右子陣列 跨越中點三種情況的最大子陣列比較取最大值。...
python分治法實現最大子陣列問題
給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。使用分治法,a low high 的任意連續子陣列a i j 所處的位置必然是以下三種情況之一 a 完全位於子陣列a low mid 中,因此low i j mid b 完全位於子陣列a mid 1 h...
最大子陣列(分治法)
尋找a low,high 中的最大連續子陣列a i,j mid low high 2,欲求的最大連續子陣列出現的位置 1 出現在a low,mid 中 即 low i j mid 2 出現在a mid 1,high 中,即 mid 3 跨越了mid位置,出現在a low,high 中,即 low i...