寻找最大子数组算法
C语言实现,下面给出完整代码:
#include<stdio.h>
#include<stdlib.h>
int *FindMaxCrossSubarray(int A[],int low,int mid,int high)
{
int left_sum = -99999;
int right_sum = -99999;
int sum = 0;
int i;
int *result;
result = (int *)malloc(sizeof(int)*3);
for(i = mid;i >= low ;i--)
{
sum += A[i];
if (sum > left_sum)
{
left_sum = sum;
result[0] = i;
}
}
sum = 0;
for(i = mid+1;i<=high;i++)
{
sum += A[i];
if(sum > right_sum)
{
right_sum = sum;
result[1] = i;
}
}
result[2] = (left_sum+right_sum);
return result;
}
int *FindMaximumSubarray(int A[],int low,int high)
{
int *result;
int mid;
int *result_left,*result_right,*result_cross;
result = (int *)malloc(sizeof(int)*3);
result_left = (int *)malloc(sizeof(int)*3);
result_right = (int *)malloc(sizeof(int)*3);
result_cross = (int *)malloc(sizeof(int)*3);
if(high == low)
{
result[0] = low;
result[1] = high;
result[2] = A[low];
return result;
}
else
{
mid = (int)((low+high)/2);
result_left = FindMaximumSubarray(A,low,mid);
result_right = FindMaximumSubarray(A,mid+1,high);
result_cross = FindMaxCrossSubarray(A,low,mid,high);
if(result_left[2] >= result_right[2] && result_left[2] >= result_cross[2])
return result_left;
else if(result_right[2] >= result_left[2] && result_right[2] >= result_cross[2])
return result_right;
else
return result_cross;
}
}
int main(void)
{
int i;
int *result;
int A[]={-1,2,-3,4,-5,6,-7,8,-9,0};
result = FindMaximumSubarray(A,0,9);
for(i=0;i<3;i++)
{
printf("%d ",result[i]);
}
printf("\n");
return 0;
}