穷举O(n3)
#include <iostream>
void Maximum_subarray(int a[],int n);
//测试数据10
//-1 -3 3 5 -4 3 2 -2 3 6
using namespace std;
int main()
{
int a[100];//数组
int n;//总数组长度
int i;
cout<<"请输入数组长度:"<<endl;
cin>>n;
cout<<"请输入数组:"<<endl;
for(i=0; i<n; i++){
cin>>a[i];
}
Maximum_subarray(a,n);
return 0;
}
void Maximum_subarray(int a[],int n){
int i, j, k;
int maxleft, maxright, maxnum, num;
maxleft = 0;
maxright = 0;
maxnum = -999;
for(i=0; i<n; i++){
for(j=i; j<n; j++){
num = 0;
for(k=i; k<=j; k++){
num += a[k];
}
if(num > maxnum){
maxnum = num;
maxleft = i;
maxright = j;
}
}
}
cout<<"最大子数组为:"<<maxnum<<endl;
cout<<"最大子数组区间为:["<<maxleft+1<<","<<maxright+1<<"]";
}
优化穷举算法O(n2):省去最内部的循环
#include <iostream>
void Maximum_subarray(int a[],int n);
//测试数据10
//-1 -3 3 5 -4 3 2 -2 3 6
using namespace std;
int main()
{
int a[100];//数组
int n;//总数组长度
int i;
cout<<"请输入数组长度:"<<endl;
cin>>n;
cout<<"请输入数组:"<<endl;
for(i=0; i<n; i++){
cin>>a[i];
}
Maximum_subarray(a,n);
return 0;
}
void Maximum_subarray(int a[],int n){
int i, j;
int maxleft, maxright, maxnum, num;
maxleft = 0;
maxright = 0;
maxnum = -999;
for(i=0; i<n; i++){
num = 0;
for(j=i; j<n; j++){
num += a[j];
if(num > maxnum){
maxnum = num;
maxleft = i;
maxright = j;
}
}
}
cout<<"最大子数组为:"<<maxnum<<endl;
cout<<"最大子数组区间为:["<<maxleft+1<<","<<maxright+1<<"]";
}
分而治之O(nlogn)
#include <iostream>
int Maximum_subarray(int a[],int mid,int n);
int Maximum_subarray_merge(int a[],int left,int mid,int right);
//测试数据10
//-1 -3 3 5 -4 3 2 -2 3 6
using namespace std;
int main()
{
int a[100];//数组
int n;//总数组长度
int i;
int maxnum;
cout<<"请输入数组长度:"<<endl;
cin>>n;
cout<<"请输入数组:"<<endl;
for(i=0; i<n; i++){
cin>>a[i];
}
maxnum = Maximum_subarray(a,0,n-1);
cout<<"最大子数组和为:"<<maxnum<<endl;
return 0;
}
int Maximum_subarray(int a[],int left, int right){
if(left >= right){
return a[left];
}
int mid;
mid = (left+right)/2;
int maxleft = Maximum_subarray(a, left, mid);
int maxright = Maximum_subarray(a, mid+1, right);
int maxmerge = Maximum_subarray_merge(a, left, mid, right);
int maxnum;
if(maxleft > maxright){
maxnum = maxleft;
}
else{
maxnum = maxright;
}
if(maxmerge > maxnum){
maxnum = maxmerge;
}
return maxnum;
}
int Maximum_subarray_merge(int a[],int left,int mid,int right){
int i;
int sum = a[mid] +a[mid+1];
int maxnum = a[mid] +a[mid+1];
for(i = mid-1; i >= left; i--){
sum += a[i];
if(sum > maxnum){
maxnum = sum;
}
}
sum = maxnum;
for(i = mid+2; i <= right; i++){
sum += a[i];
if(sum > maxnum){
maxnum = sum;
}
}
return maxnum;
}