brute-force法
typedef struct {
int max_left;
int max_right;
int maximum;
}maxinfo;
maxinfo bruteforce(int A[], int len)
{
maxinfo max;
max.max_left= 0;
max.max_right= 0;
max.maximum= 0;
inti, j;
for(i = 0; i < len; i ++)
{
intsum = A[i];
intimax = A[i];
intmax_j = i;
for(j = i + 1; j < len; j ++)
{
sum= sum + A[j];
if(sum > imax)
{
imax= sum;
max_j= j;
}
}
if(imax > max.maximum)
{
max.max_left= i;
max.max_right= max_j;
max.maximum= imax;
}
}
returnmax;
}
分治法
typedefstruct {
intmax_left;
intmax_right;
intmaximum;
}maxinfo;
maxinfo
find_crossing_max_subarray(int a[], int low, int mid, int high)
{
inti;
intsum = 0;
intleft_sum = -32767;
maxinfomax;
for(i = mid; i >= low; i--)
{
sum= sum + a[i];
if(sum > left_sum)
{
left_sum= sum;
max.max_left= i;
}
}
intright_sum = -32767;
intj;
sum= 0;
for(j = mid + 1; j <= high; j ++)
{
sum= sum + a[j];
if(sum > right_sum)
{
right_sum= sum;
max.max_right= j;
}
}
max.maximum= left_sum + right_sum;
returnmax;
}
maxinfofind_max_subarray(int a[], int low, int high)
{
maxinfomax;
if(low == high)
{
max.max_left= low;
max.max_right= high;
max.maximum= a[low];
returnmax;
}
intmid = (low + high)/2;
maxinfomax_left, max_cross, max_right;
max_left= find_max_subarray(a, low, mid);
max_right= find_max_subarray(a, mid + 1, high);
max_cross= find_crossing_max_subarray (a, low, mid, high);
if(max_left.maximum > max_right.maximum && max_left.maximum> max_cross.maximum)
returnmax_left;
elseif (max_right.maximum > max_left.maximum &&max_right.maximum > max_cross.maximum)
returnmax_right;
else
returnmax_cross;
}