您的位置:首页 > 其它

寻找最大和子数组 Find maximum subarrray

2014-05-08 14:09 411 查看
问题描述:输入是一个大小为n的整型数组,要求输出数组的任何连续子数组中的最大值(即该子数组的各个元素之和是最大的)。

例如:输入的数组为array[16] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};输出最大连续子数组和为array[7...10]:43

详细的分析可以参见《算法导论》英文版 Divide-and-conquer一章。里面有详细的伪代码分析。或者参看/article/4834205.html中的算法3。两者的思路是一样的。

/*=============================================================================
#
#     FileName: MaximumSubarray.cpp
#         Desc: 寻找最小子数组。《算法导论》——Divide-and-conquer
#
#       Author: yulu
#        Email: 187373778@qq.com
#
#      Created: 2014-05-07 23:51:00
#      Version: 0.0.1
#      History:
#               0.0.1 | yulu | 2014-05-07 23:00:00 | initialization
#
=============================================================================*/
#include <iostream>
using namespace std;

void cross_mid(int A[],int low,int mid,int high,int *pos_begin,int *pos_end,int *sum)
{
int left_max=A[mid];
int right_max=A[mid+1];
int temp_sum=0;
for(int i=mid;i>=low;i--)
{
temp_sum+=A[i];
if(temp_sum>=left_max) //找出左半边的最大子数组
{
*pos_begin=i;
left_max=temp_sum;
}
}

temp_sum=0;
for(int j=mid+1;j<=high;j++)
{
temp_sum+=A[j];
if(temp_sum>=right_max)  //找出右半边最大子数组
{
*pos_end=j;
right_max=temp_sum;
}
}

*sum=left_max+right_max;  //合并

return;
}

int find_maximum_subarray(int A[],int low,int high,int *pos_begin,int *pos_end,int *sum)
{
if(low>high)//参数异常
return 0;
else if(low==high) //只有一个元素
{
*pos_begin=*pos_end=low;
*sum=A[low];
}
else
{
int mid=(low+high)/2;

//子数组在A的左半边
int left_begin,left_end,left_sum;
find_maximum_subarray(A,low,mid,&left_begin,&left_end,&left_sum);

//子数组在A的右半边
int right_begin,right_end,right_sum;
find_maximum_subarray(A,mid+1,high,&right_begin,&right_end,&right_sum);

//子数组跨越中点
int cross_begin,cross_end,cross_sum;
cross_mid(A,low,mid,high,&cross_begin,&cross_end,&cross_sum);

//比较以上三种子数组,哪一个的和最大
if(left_sum>=right_sum && left_sum>=cross_sum)
{
*sum=left_sum;
*pos_begin=left_begin;
*pos_end=left_end;
}
else if(right_sum>=left_sum && right_sum>=cross_sum)
{
*sum=right_sum;
*pos_begin=right_begin;
*pos_end=right_end;
}
else
{
*sum=cross_sum;
*pos_begin=cross_begin;
*pos_end=cross_end;
}
}
}

int main()
{
int A[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
int sub_begin,sub_end,sum;
int low=0,high=15;
find_maximum_subarray(A,low,high,&sub_begin,&sub_end,&sum);
cout<<"The maximum subarray sum is: "<<sum<<endl;
cout<<sub_begin<<" "<<sub_end<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: