求某一数组最大子数组和的三种方法

/*
	Name: 最大子数组的和 
	Copyright: jinfan 
	Author: renyuzhuo 
	Date: 20/08/13 10:12
	Description: 在一个数组中找出和为最大的某一子数组,输出最大的和 
*/
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
#define t 10
using namespace std;
int largestArray1(int a[]);
int largestArray2(int a[]);
int largestArray3(int a[],int i,int j);
int deal2(int a[],int m,int mid,int n);
int deal(int a[],int m,int n);
int main()
{
	int n,num[t],i;
	bool choose=true;
	while(choose)
	{
		cin>>n;
		srand((unsigned)time(NULL));
		for(i=0;i<t;i++)
		{
			num[i]=rand()%10;
			if(num[i]%2==0)
			{
				num[i]*=-1;
			}
			cout<<num[i]<<" ";
		}
		cout<<endl<<endl;
		switch(n)
		{
			
			//用三种不同方法,1暴力求解,2记录了某些找到了的结果,使之更快速
			//三用分治与递归 
			case 1:cout<<largestArray1(num)<<endl;//break;
			case 2:cout<<largestArray2(num)<<endl;//break;
			case 3:cout<<largestArray3(num,0,t-1)<<endl<<endl;break;
			case 4:choose=false;break;//输入4退出 
			default:cout<<"wrong"<<endl;
		}
	}
	return 0;
}

/**
 *对所有可能进行一次比较 
 */
int largestArray1(int a[])
{
	int max=-100,i,j,sum;
	for(i=0;i<t;i++)
	{
		sum=0;
		for(j=i;j<t;j++){
			sum+=a[j];
			if(sum>max){
				max=sum;
			}
		}
	}
	return(max);
}

/**
 *记录某些运算结果 
 */
int largestArray2(int a[])
{
	int i,j,max=-100,x=0,sum,y=0;
	for(i=0;i<t;i++){
		if(a[i]<0)continue;
		sum=0;
		for(j=i;j>=x;j--){
			sum+=a[j];
			if(sum>max){
				max=sum;
				y=j;
			}
		}
		x=y;
	}
	return(max);
	
	
}

/**
 *分治与递归 
 */ 
int largestArray3(int a[],int i,int j){
	return(deal(a,0,j));
}
int deal(int a[],int m,int n)
{
	int mid,key1,key2,key3;
	if(m==n){
		return(a[m]);
	}
	mid=(m+n)/2;
	key1=deal(a,m,mid);//前一半数组最大和 
	key2=deal(a,mid+1,n);//后一半数组最大和 
	key3=deal2(a,m,mid,n);//跨过中间元素最大和 
	if(key1>key2){
		return(key1>key3?key1:key3);
	}else{
		return(key2>key3?key2:key3);
	}
}

/**
 *计算某一数组m-n间跨过中间元素的最大和 
 */
int deal2(int a[],int m,int mid,int n)
{
	int i,j,sum,max1=-100,max2=-100;
	for(i=mid,sum=0;i>=m;i--){
		sum+=a[i];
		if(sum>max1){
			max1=sum;
		}
	}
	for(j=mid+1,sum=0;j<=n;j++){
		sum+=a[j];
		if(sum>max2){
			max2=sum;
		}
	}
	return(max1+max2);
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值