max sub array of the given array

/*******************************************************************************                
* @version               $v1.0$
* @date                  $6.10.2012$
* @author                $Alfred$
* @brief                 Find a max subarry for a given array
			 The divide-and-conquer is used by this program
			 Ps: the concrete analysis can be found in Chapter 4 of 
			 Introduction to Algorithms(Third Edition)
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define NUM 10

int main(void)
{
	int a[NUM] = { 2,4,-8,-23,37,23,1,-2,-10,54};
	int begin, end, maxValue;
	//int FindMaxCrossSubarray(int *arr, int begin, int mid, int end, int *crossLow, int *crossHigh);
	//maxValue = FindMaxCrossSubarray( a, 0, 4, 9, &begin, &end);
	int FindMaxSubarry(int *arr, int begin, int end, int *low, int *high);
	maxValue = FindMaxSubarry(a, 0, NUM - 1, &begin, &end);
	printf("%d,%d,%d", begin, end, maxValue);
}


int FindMaxCrossSubarray(int *arr, int begin, int mid, int end, int *crossLow, int *crossHigh)
{
	int leftSum = -10000, rightSum = -10000, sum = 0, i, j;
	for ( i = mid; i >= begin; i--)
	{
		sum = sum + arr[i];
		if( sum > leftSum)
		{
			leftSum = sum;
			*crossLow = i;
		}
	}
	sum = 0;
	for (j = mid + 1; j <= end; j++)
	{
		sum = sum + arr[j];
		if (sum > rightSum)
		{
			rightSum = sum;
			*crossHigh = j;
		}
	}
	return (leftSum + rightSum);
}

		
int FindMaxSubarry(int *arr, int begin, int end, int *low, int *high)
{
	int leftLow, leftHigh, rightLow, rightHigh, crossLow, crossHigh;
	int mid, maxValue1, maxValue2, maxValue3, maxValue;
	int FindMaxCrossSubarray(int *arr, int begin, int mid, int end, int *crossLow, int *crossHigh);
	if ( begin == end )
	{
		*low = begin;
		*high = end;
		return arr[begin];
	}
	else
	{
		mid = (begin + end) / 2;
		maxValue1 = FindMaxSubarry( arr, begin, mid, &leftLow, &leftHigh);
		maxValue2 = FindMaxSubarry( arr, mid + 1, end, &rightLow, &rightHigh);
		maxValue3 = FindMaxCrossSubarray( arr, begin, mid, end, &crossLow, &crossHigh);
		if(maxValue1 >= maxValue2 && maxValue1 >= maxValue3)
		{
			maxValue = maxValue1;
			*low = leftLow;
			*high = leftHigh;
		}
		else if(maxValue2 >= maxValue1 && maxValue2 >= maxValue3)
		{
			maxValue = maxValue2;
			*low = rightLow;
			*high = rightHigh;
		}
		else
		{
			maxValue = maxValue3;
			*low = crossLow;
			*high = crossHigh;
		}
	}
	return maxValue;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值