学数据结构的第一个算法,最大子列和问题,即求一个数组连续子列和求最大


问题:给定一整数序列a1,a2,a3,...an(可能有负数),求a1~an的一个子序列ai~aj,使得ai~aj的和最大

 例如:a[]={4,-3,5,2,-1,2,6,2},考虑算法的复杂度,给出三种不同复杂度,以c语言实现

1.算法复杂度为o(n2),是穷举法的一个改进算法

<span style="font-size:18px;">elemtype function1(elemtype a[])
{
	int i,j;
	elemtype sum,maxm=0;
	for(i = 0;i < N;i++)
	{
		sum = 0;                 /*sum是a[i]到a[j]的连续和*/
		for(j = i;j < N;j++)
		{
			sum += a[j];
			if(sum > maxm)
			    maxm = sum;
		}
	}
	return maxm;
} </span>

2.算法复杂度为o(nlogn),利用的是递归,分而治之的方法

<span style="font-size:18px;">elemtype function2(elemtype a[],int left,int right)
{
	int centre = (left+right)/2;
	if(left == right)      /*最底层递归调用*/
	{
	    return a[left];
	}
	
	elemtype maxleft=function2(a,left,centre);         /*左半边最大值*/ 
	elemtype maxright=function2(a,centre+1,right);          /*右半边最大值*/ 
	int leftBorderSum=0,maxleftBorderSum=0;
	for(int i = centre;i >= left;i--)              /*跨边界从中间开始向左边界求最大和*/ 
	{
		leftBorderSum += a[i];
		if(leftBorderSum > maxleftBorderSum) 
		    maxleftBorderSum = leftBorderSum;
	}
	int rightBorderSum = 0,maxrightBorderSum = 0;
	for(int i = centre+1;i <= right;i++)            /*跨边界从中间开始向右边界求最大和*/
	{
		rightBorderSum += a[i];
		if(rightBorderSum > maxrightBorderSum)
			maxrightBorderSum=rightBorderSum;
	}
	return max(maxleft,maxright,maxleftBorderSum+maxrightBorderSum); 
	
}</span>
3.算法的复杂度为o(n),运用动态规划思想

elemtype function3(elemtype a[],int n)
{
	elemtype sum=0,max=0;
	for(int i = 0;i < n;i++)
	{
		sum += a[i];
		if(sum > max)
			max = sum;
		else if(sum < 0)
		    sum = 0;	
	}
	return max;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值