【C++單排之路】求解最大子數組


//求解最大子數組
//使用分治策略
//對一定規模的母數組,以中點分界,最大子數組只可能出現在左半部分,跨中點,右半部分
#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;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章