分治算法--最大子数组

#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;
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值