/*******************************************************************************
* @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;
}
max sub array of the given array
最新推荐文章于 2019-01-23 14:23:56 发布