最大子数组

来源:互联网 发布:jquery遍历json对象 编辑:程序博客网 时间:2024/06/05 17:47
/*函数:最大子数组  从一组数字总选取和最大的非空连续子数组  注意:只有当数组中含有负数时,才有意义算法复杂度 n*lognT(n)=2T(n/2)+O(n)如果从中选择任意两个(开始和结束点),复杂度为 n^2时间:15.7.12  Jason Zhou  热爱你所写下的程序,他是你的伙伴,而不是工具.*/#include <iostream>using namespace  std;typedef struct subarr_struct{    int low;    int high;    int sum;};//从 [X,mid] 和  [mid+1,Y]中找出最大的和,进行相加.subarr_struct find_crossing_subarray(int arr[],int low,int mid,int high){    int left_sum=arr[mid]-1;    int sum=0;    int left_pos;    for (int i=mid;i>=0;i--)    {        sum+=arr[i];        if (sum>left_sum)        {            left_sum=sum;            left_pos=i;        }    }    int right_sum=arr[mid+1]-1;    int right_pos;    sum=0;    for (int j=mid+1;j<=high;j++)    {        sum+=arr[j];        if (sum>right_sum)        {            right_sum=sum;            right_pos=j;        }    }    subarr_struct cross_str;    cross_str.low=left_pos;    cross_str.high=right_pos;    cross_str.sum=left_sum+right_sum;    return cross_str;}subarr_struct find_maxnum_sumarray(int arr[],int low,int high){    subarr_struct min_struct;    subarr_struct left_struct;    subarr_struct right_struct;    subarr_struct cross_struct;    if (low==high)          {        min_struct.low=low;        min_struct.high=high;        min_struct.sum=arr[low];        return min_struct;    }    else    {        int mid=(low+high)/2;        left_struct=find_maxnum_sumarray(arr,low,mid);        right_struct=find_maxnum_sumarray(arr,mid+1,high);        cross_struct=find_crossing_subarray(arr,low,mid,high);    }    if ( (left_struct.sum>right_struct.sum)&&(left_struct.sum>cross_struct.sum) )    {        return left_struct;    }else if (right_struct.sum>cross_struct.sum)     {        return right_struct;    }else    {        return cross_struct;    }}int main(void){    int a[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};    int len=sizeof(a)/sizeof(a[0]);    for (int i = 0; i < len; i++)        cout<<a[i]<<" ";    cout<<endl;    subarr_struct find_struct;    find_struct=find_maxnum_sumarray(a,0,len-1);    cout<<"low="<<find_struct.low<<"   high="<<find_struct.high<<"  sum="<<find_struct.sum<<endl;    return 0;}
0 0
原创粉丝点击