C 最大子陣列,遞迴實現,分治法

2021-09-26 14:46:17 字數 1765 閱讀 1745

// 尋找最大子陣列-遞迴.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...