#include<iostream>
#include<vector>
using namespace std;
#define Minium -10000
typedef struct Node{ //return type
int low;
int high;
int sum;
}Node;
//分治方法求最大子数组
//p为起点 r为终点,mid为中点
Node Find_Max_Subarry(vector<int> &A, int p, int r);
Node Find_CrossMax_Subarry(vector<int> &A, int p, int mid, int r);
int main(void)
{
//第一个元素0仅填充空间
vector<int> A = { 0,13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 };
int len = A.size();
Node res;
res = Find_Max_Subarry(A, 1, 16); //求最大子数组
cout << res.low << " " << res.high << " " << res.sum << endl;
return 0;
}
//当最大子数组横跨中点时
Node Find_CrossMax_Subarry(vector<int> &A, int p, int mid, int r)
{
Node left, right, Res;
int i;
int MaxSumL = Minium;
int MaxSumR = Minium;
left.sum = right.sum = 0;
for (i = mid; i >= p; i--)
{
left.sum += A[i];
if (left.sum > MaxSumL)
{
MaxSumL = left.sum;
left.low = i;
}
}
for (i = mid+1; i <= r; i++)
{
right.sum += A[i];
if (right.sum > MaxSumR)
{
MaxSumR = right.sum;
right.high = i;
}
}
Res.low = left.low;
Res.high = right.high;
Res.sum = MaxSumL + MaxSumR;
return Res;
}
Node Find_Max_Subarry(vector<int> &A, int low, int high)
{
Node Res, left, right, Cross;
int mid;
if (low == high)
{
Res.low = low;
Res.high = high;
Res.sum = A[low];
return Res;
}
else
{
mid = (int)((high + low) / 2);
left = Find_Max_Subarry(A, low, mid);
right = Find_Max_Subarry(A, mid + 1, high);
Cross = Find_CrossMax_Subarry(A, low, mid, high);
if (left.sum >= right.sum && left.sum >= Cross.sum)
return left;
if (right.sum >= left.sum && right.sum >= Cross.sum)
return right;
if (Cross.sum >= right.sum && Cross.sum >= left.sum)
return Cross;
}
}
《算法导论》中求最大子数组的C++实现
最新推荐文章于 2023-03-08 19:05:21 发布