#include <stdio.h>
#include <stdlib.h>
#define Min -999999
struct node{
int low;
int high;
int sum;
};
struct node FIND_MAX_CROSSING_SUBARRAY(int f[],int low,int mid,int high);
struct node FIND_MAX_SUBARRAY(int f[],int low,int high);
int main()
{
int n;
int i;
int f[100];
while(1){
printf("输入数组个数\n");
scanf("%d",&n);
printf("输入数字\n");
for(i=0;i<n;i++){
scanf("%d",&f[i]);
}
printf("结果为:\n");
struct node cross;
cross=FIND_MAX_SUBARRAY(f,0,n-1);
printf("%d %d %d\n",cross.low+1,cross.high+1,cross.sum);
}
return 0;
}
struct node FIND_MAX_CROSSING_SUBARRAY(int f[],int low,int mid,int high){
int left_sum=Min;
int right_sum=Min;
int max_left;
int max_right;
int sum=0;
int i;
for(i=mid;i>=low;i--){
sum+=f[i];
if(sum>left_sum){
left_sum=sum;
max_left=i;
}
}
sum=0;
for(i=mid+1;i<=high;i++){
sum+=f[i];
if(sum>right_sum){
right_sum=sum;
max_right=i;
}
}
struct node cross;
cross.low=max_left;
cross.high=max_right;
cross.sum=left_sum+right_sum;
return cross;
}
struct node FIND_MAX_SUBARRAY(int f[],int low,int high){
if(low==high)
{
struct node cross;
cross.low=low;
cross.high=high;
cross.sum=f[low];
return cross;
}
else{
int left_sum;
int right_sum;
int cross_sum;
struct node left;
struct node right;
struct node cross;
int mid=(low+high)/2;
left=FIND_MAX_SUBARRAY(f,low,mid);
left_sum=left.sum;
right=FIND_MAX_SUBARRAY(f,mid+1,high);
right_sum=right.sum;
cross=FIND_MAX_CROSSING_SUBARRAY(f,low,mid,high);
cross_sum=cross.sum;
if(left_sum>=right_sum&&left_sum>=cross_sum){
return left;
}else if(right_sum>=left_sum&&right_sum>=cross_sum){
return right;
}else{
return cross;
}
}
}
分治算法--最大子数组
最新推荐文章于 2025-04-06 22:25:45 发布
751

被折叠的 条评论
为什么被折叠?



