分析
FIND-MAX-CROSSING-SUBARRY(A,low,mid,high)
left-sum = -∞ //左子数组最大子数组之和
sum = 0
for i = mid downto low //查找经过中间项的最大左子数组
sum = sum + A[i]
if sum > left-sum
left-sum = sum
max-left = i
right-sum = -∞ //右子数组最大子数组之和
sum = 0
for j = mid + 1 to high //查找经过中间项的最大右子数组
sum = sum + A[j]
if sum > right-sum
right-sum = sum
max-right = j
return(max-left,max-right,left-sum + right-sum) //合并即为最大中间子数组
#include
#include
typedef struct{
int leftmax1;
int rightmax1;
int maxsum1;
}mystruct; //定义结构体用来存储最大子数组
mystruct midmax(int a[],int low,int mid,int high) //结构体函数传递每层递归最大中间子数组
{
mystruct midside; //最大中间子数组
int sum,i,j;
int leftmax,rightmax,maxsum,max = 0;
sum = 0;
maxsum = -100;
for(i = mid;i >=low;i--) //查找经过中间项最大左子数组
{
sum = sum+a[i];
if(sum > maxsum)
{
maxsum = sum;
leftmax = i;
}
}
max = max+maxsum;
sum = 0;
maxsum = -100;
for(j = mid+1;j<=high;j++) //查找经过中间项最大右子数组
{
sum = sum+a[j];
if(sum>maxsum)
{
maxsum = sum;
rightmax = j;
}
}
max = max+maxsum; //确定最大中间子数组
midside.leftmax1 = leftmax;
midside.rightmax1 = rightmax;
midside.maxsum1 = max;
return midside;
}
mystruct digui(int a[],int low,int high)
//递归部分
{
mystruct answer;
mystruct leftside;
mystruct rightside,midside;
int mid = 0;
if(low == high) //触底情况,即基本情况,直接给出答案
{
answer.leftmax1 = low;
answer.rightmax1 = high;
answer.maxsum1 = a[low];
return answer;
}
else{
mid = (low+high)/2;
leftside = digui(a,low,mid);
rightside = digui(a,mid+1,high);
midside = midmax(a,low,mid,high);
if(leftside.maxsum1 >= rightside.maxsum1&&leftside.maxsum1 >= midside.maxsum1)
return leftside;
else if(rightside.maxsum1 >= leftside.maxsum1&&rightside.maxsum1 >= midside.maxsum1)
return rightside;
else if(midside.maxsum1 >= rightside.maxsum1&&midside.maxsum1 >= leftside.maxsum1)
return midside;
} //比较每层左最大子数组,右最大子数组,中间最大子数组,确定该层最大子数组
}
int main()
{
mystruct answer;
int a[10];
a[0] = 7;
a[1] = 5;
a[2] = -4;
a[3] = 0;
a[4] = -3;
a[6] = 1;
a[7] = -2;
a[8] = 3;
a[9] = 3;
answer = digui(a,0,9); //调用函数
printf("\n %d\n",answer.maxsum1);
return 0;
}