原理实见算法导论第三版P39—P42:
C代码实现:
<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
#include "limits.h"
#define INT_MIN (-INT_MAX - 1)
int *Find_Max_Subarray(int *A,int low,int high);
int *Find_Max_Crossing_Subarray(int *A,int low,int mid,int high);
void main()
{
int array[16]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
int *ans=(int *)malloc(sizeof(int)*3);
ans=Find_Max_Subarray(array,0,15);
printf("%d,%d,%d\n",ans[0],ans[1],ans[2]);
free(ans);
}
int *Find_Max_Crossing_Subarray(int *A,int low,int mid,int high)
{
int left_sum=INT_MIN;
int right_sum=INT_MIN;
int sum=0;
int max_left,max_right;
for (int i=mid;i>low-1;i--)
{
sum+=*(A+i);
if (sum>left_sum)
{
left_sum=sum;
max_left=i;
}
}
sum=0;
for (int j=mid+1;j<high+1;j++)
{
sum+=*(A+j);
if (sum>right_sum)
{
right_sum=sum;
max_right=j;
}
}
int *results=(int *)malloc(sizeof(int)*3);
results[0]=max_left;
results[1]=max_right;
results[2]=left_sum+right_sum;
return results;
}
int *Find_Max_Subarray(int *A,int low,int high)
{
int *answers=(int *)malloc(sizeof(int)*3);
if(low==high)
{
answers[0]=low;
answers[1]=high;
answers[2]=A[low];
return answers;
}
else
{
int *answers_1=(int *)malloc(sizeof(int)*3);
int *answers_2=(int *)malloc(sizeof(int)*3);
int mid=(low+high)/2;
answers=Find_Max_Subarray(A,low,mid);
answers_1=Find_Max_Subarray(A,mid+1,high);
answers_2=Find_Max_Crossing_Subarray(A,low,mid,high);
if (answers[2]>=answers_1[2] && answers[2]>=answers_2[2])
return answers;
else if(answers_1[2]>=answers[2] && answers_1[2]>=answers_2[2])
return answers_1;
else
return answers_2;
}
}</span>
存在的问题:子函数中动态分配的内存没有释放
解决方案:1、不要在子函数中分配,直接全局动态分配空间,最后再释放
2、使用结构体
3、使用c++