参考网址:这里写链接内容
#include<iostream>
#include<math.h>
using namespace std;
// 返回跨越中值的最大数组和
int* find_max_crossing_sub(int *arr, int low, int mid, int high)
{
int left_sum = INT_MIN;
int sum = 0;
int max_left = mid;
for (int i = mid; i >= low; i--)
{
sum += arr[i];
if (sum > left_sum)
{
left_sum = sum;
max_left = i;
}
}
int right_sum = INT_MIN;
sum = 0;
int max_right = 0;
for (int i = mid+1; i <= high; i++)
{
sum += arr[i];
if (sum > right_sum)
{
right_sum = sum;
max_right = i;
}
}
// cout << "左值下标:" << max_left << "右值下标:" << max_right << "总和:" << (left_sum + right_sum) <<endl;
int *data;
data = new int [3];
data[0] = max_left;
data[1] = max_right;
data[2] = left_sum + right_sum;
return data;
}
// 分治算法
int* find_max_sub(int *arr, int low, int high)
{
if (high == low)
{
int *data = new int[3];
data[0] = low;
data[1] = high;
data[2] = arr[low];
return data;
} else
{
int *leftdata = new int[3];
int *rightdata = new int[3];
int *middata = new int[3];
int mid = int(floor((high + low)/2));
leftdata = find_max_sub(arr, low, mid);
rightdata = find_max_sub(arr, mid+1, high);
middata = find_max_crossing_sub(arr, low, mid, high);
if (leftdata[2] >= rightdata[2] && leftdata[2] >= middata[2])
{
return leftdata;
} else
{
if (rightdata[2] >= leftdata[2] && rightdata[2] >= middata[2])
{
return rightdata;
} else
{
return middata;
}
}
}
}
int main()
{
int arr[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
int *data = new int[3];
data = find_max_sub(arr, 0, 15);
cout << "左值下标:" << data[0] << "右值下标:" << data[1] << "总和:" << data[2] <<endl;
system("pause");
return 0;
}