算法导论(第三版) Exercises4.2(求最大和子数组的算法优化过程)

4.1-1

如所有元素都为负,则返回所有元素中最大的负数。

4.1-2(暴力法求最大和子数组)

struct subarray
{
    int start, end, sum;
};
void bruteFindMaxSubarray(int a[], int left, int right, struct subarray* result)
{
    int i, j, sum=a[left];
    int tempSum;
    int l = left;
    int r = l;
    for(i=left; i<=right; i++)
    {
        tempSum = a[i];
        for(j=i+1; j<=right; j++)
        {
            tempSum += a[j];
            if(tempSum > sum)
            {
                l = i;
                r = j;
                sum = tempSum;
            }
        }
    }
    result->start = l;
    result->end = r;
    result->sum = sum;
}
View Code

4.1-3(归并算法求最大和子数组)

int mergeFindSub(int a[], int l, int r, int result[])
{
    int i, j, k, mid;
    int leftSum = 0;
    int rightSum = 0;
    int crossSum = 0;
    int leftResult[3] = {0};
    int rightResult[3] = {0};
    int crossResult[3] = {0};
    if(l == r)
    {
        result[0] = l;
        result[1] = r;
        result[2] = a[l];
    }
    else
    {
        mid = (l + r) / 2;
        leftSum = mergeFindSub(a, l, mid, leftResult);
        rightSum = mergeFindSub(a, mid+1, r, rightResult);
        crossSum = crossingSub(a, l, mid, r, crossResult);
        if(leftSum >= rightSum && leftSum >= crossSum)
            for(i=0; i<3; i++) result[i] = leftResult[i];
        else if(rightSum >= leftSum && rightSum >= crossSum)
            for(j=0; j<3; j++) result[j] = rightResult[j];
        else
            for(k=0; k<3; k++) result[k] = crossResult[k];
    }
    return result[2];
}

int crossingSub(int a[], int l, int m, int r, int result[])
{
    int i, j, leftSum, rightSum, sum;
    int min = -10000;
    rightSum = min;
    leftSum = min;
    sum = 0;
    for(i=m; i>=l; i--)
    {
        sum += a[i];
        if(sum > leftSum)
        {
            result[0] = i;
            leftSum = sum;
        }
    }
    sum = 0;
    for(j=m+1; j<=r; j++)
    {
        sum += a[j];
        if(sum > rightSum)
        {
            result[1] = j;
            rightSum = sum;
        }
    }
    result[2] = leftSum + rightSum;
    return result[2];
}
View Code

4.1-4

如果允许空串,只要加一句

if (sum < 0)  return sum=0;

4.1-5(线性算法求最大和字串)

void linearFindSub(int a[], int n, int result[])
{
    int i, l, temp, sum;
    int min = -10000;
    sum = min;
    temp = 0;
    l = 0;
    for(i=0; i<n; i++)
    {
        if(temp < 0)
        {
            temp = a[i];
            l = i;
        }
        else
            temp += a[i];
        if(sum < temp)
        {
            result[0] = l;
            result[1] = i;
            sum = temp;
        }
    }
    result[2] = sum;
}
View Code

 

posted @ 2015-08-23 12:23  _不忘初心方得始终  阅读(185)  评论(0编辑  收藏  举报