寻找一个数组的最大子数组(子数组之和最大)
Max_Crossing_Arr(int a[], int low, int high, int mid)
该函数寻找一个跨越中点的最大子数组。
Max_Arr(int a[],int low,int high)
该函数寻找一个数组的最大子数组:先找左半边的最大子数组,再找右半边最大子数组,再找跨越中点的最大子数组,(其中递归调用自身于寻找左右两边的最大子数组)。最后比较出最大的子数组作为最后返回值。
代码
代码片
.
#include <stdio.h>
#define MIN -99999
typedef struct positionASum{//创建该结构体保存数组中的最低位,最高位,以及最大和
int low;
int high;
int sum;
}PositionASum;
PositionASum Max_Crossing_Arr(int a[], int low, int high, int mid){//求跨越中点的最大子数组
int left_sum = MIN;//左半边的最大和
int sum = 0;//下标i所到之处的和
int i;
int max_left = 0;//左半边的数组的某一个值的最大值
for(i=mid;i>=low;i--){
sum += a[i];
if(sum>left_sum){//若和值大于最大和则更新之
left_sum = sum;
max_left = i;//记录最大值下标
}
}
//右半边类似
int right_sum = MIN;
sum = 0;
int j;
int max_right = 0;
for(j=mid+1;j<=high;j++){
sum += a[j];
if(sum>right_sum){
right_sum = sum;
max_right = j;
}
}
PositionASum ps;//返回跨越中点的最大子数组的最低位,最高位以及最大和
ps.low = max_left;
ps.high = max_right;
ps.sum = left_sum + right_sum;
return ps;
}
PositionASum Max_Arr(int a[],int low,int high){ //求一个子数组的最大子数组(子数组和最大)
PositionASum left;
PositionASum right;
PositionASum mid;
int midd;
if(high == low){//当数组仅有一个元素
PositionASum ps;
ps.low = low;
ps.high = high;
ps.sum = a[low];
return ps;
}else{//递归,分治合并
midd=(low+high)/2;
//printf("此处执行一次left\n");
left = Max_Arr(a,low,midd);//递归调用自身找到左半边的最大子数组
//printf("此处执行一次right\n");
right = Max_Arr(a,midd+1,high);//递归调用找到右半边最大子数组
//printf("此处执行一次mid\n");
mid = Max_Crossing_Arr(a,low,high,midd);//找到跨越中点的最大子数组
}
if(left.sum>=right.sum && left.sum>=mid.sum){//左半边子数组最大则返回左半边子数组
return left;
}else if(right.sum>=left.sum && right.sum>=mid.sum){//返回右半边子数组
return right;
}else {//返回跨越中点子数组
return mid;
}
}
int main()
{
int A[10] = {-1,4,0,1,-1,3,-2,8,-3,-5};
PositionASum result = Max_Arr(A,0,9);
printf("最大子数组的最低位为:A[%d]=%d,最高位为:A[%d]=%d;最大子数组之和为:%d\n",result.low,A[result.low],result.high,A[result.high],result.sum);//打印结果
return 0;
}
参考[1]: https://www.cnblogs.com/AlgrithmsRookie/p/5882379.html