
//求解最大子数组
//使用分治策略
//对一定规模的母数组,以中点分界,最大子数组只可能出现在左半部分,跨中点,右半部分
#include<iostream>
#define negInf -1000;
using namespace std;
class arraySign{
public:
arraySign(int l,int r,int v){
left = l;
right = r;
value = v;
}
int left;
int right;
int value;
};
//求穿过中点的最大子数组
arraySign mid_acrossing(int *a,int s,int m,int e){
int max_value = negInf;
int left;
int sum = 0;
for(int i=m;i>=s;i--){
sum += a[i];
if(sum>max_value){
max_value = sum;
left = i;
}
}
int max_value_right = negInf;
sum = 0;
int right;
for(int i=m+1;i<=e;i++){
sum += a[i];
if(sum>max_value_right){
max_value_right = sum;
right = i;
}
}
arraySign arr(left,right,max_value+max_value_right);
return arr;
}
arraySign maxSubALG(int *a,int start,int end){
if(start==end){
arraySign arr(start,end,a[start]);
return arr;
}
else{
int mid = (start+end)/2;
arraySign l_sign = maxSubALG(a,start,mid);
arraySign m_sign = mid_acrossing(a,start,mid,end);
arraySign r_sign = maxSubALG(a,mid+1,end);
if((m_sign.value>=l_sign.value)&&(m_sign.value>r_sign.value)){
return m_sign;
}else if (l_sign.value>=r_sign.value){
return l_sign;
}else{
return r_sign;
}
}
}
int main(){
int array[16] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
arraySign ans_sign = maxSubALG(array,0,15);
cout<<" Max subarray is "<<ans_sign.left<<" to "<<ans_sign.right<<endl;
cout<<" Max value is "<<ans_sign.value<<endl;
system("pause");
return 0;
}
