算法导论4.1DivideAndConquer寻找最大子数组

本文介绍了一种寻找一维数组中具有最大和的连续子数组的算法实现。该算法通过递归方式分解问题,并结合左右子数组的最大和来确定整个数组的最大子数组范围及其和。代码示例使用C++编写,展示了核心函数Find_MaxiMum_SubArray的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

PS`YOL((_PKTTU($)M~W$}J

 

5UW~}C3%EC8L6AG}PDJXP0Y

 

~1I~%81$F~_P6N}%ZQH]%9O

 

QAH%N~88D5427NJ7IQ42@%I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

寻找最大子数组

// find_max_sub_array.h
#include <stdint.h>

int Find_MAX_CROSSING_SUBARRAY(int* A, int low, int mid, int high, int& max_left, int& max_right, int& max_value)
{
    int left_sum = 0xFFFFFFFF; // 不可能的最小值
    int sum = 0;

    for(int i = mid; i > low; i--)
    {
        sum = sum + A[i];
        if(sum > left_sum)
        {
            left_sum = sum;
            max_left = i;
        }
    }

    int right_sum = 0xFFFFFFFF; // 不可能的最小值
    sum = 0;

    for(int j = mid + 1; j < high; j++)
    {
        sum = sum + A[j];
        if(sum > right_sum)
        {
            right_sum = sum;
            max_right = j;
        }
    }

    max_value = left_sum + right_sum;
    return 0;
}

int Find_MaxiMum_SubArray(int* A, int low, int high, int& max_left, int& max_right, int& max_value)
{
    if(high == low)
    {
        max_left  = low;
        max_right = high;

        max_value = A[low];
    }
    else
    {
        int mid = (low + high) / 2;

        int tmp_left_low;
        int tmp_left_high;
        int tmp_left_sum;

        Find_MaxiMum_SubArray(A, low, mid, tmp_left_low, tmp_left_high, tmp_left_sum);

        int tmp_right_low;
        int tmp_right_high;
        int tmp_right_sum;

        Find_MaxiMum_SubArray(A, mid + 1, high, tmp_right_low, tmp_right_high, tmp_right_sum);

        int tmp_cross_low;
        int tmp_cross_high;
        int tmp_cross_sum;

        Find_MAX_CROSSING_SUBARRAY(A, low, mid, high, tmp_cross_low, tmp_cross_high, tmp_cross_sum);

        if ((tmp_left_sum >= tmp_right_sum) && (tmp_left_sum >= tmp_cross_sum))
        {
            max_left  = tmp_left_low;
            max_right = tmp_left_high;
            max_value = tmp_left_sum;
        }
        else if((tmp_right_sum >= tmp_left_sum) && (tmp_right_sum >= tmp_cross_sum))
        {
            max_left  = tmp_right_low;
            max_right = tmp_right_high;
            max_value = tmp_right_sum;
        }
        else
        {
            max_left  = tmp_cross_low;
            max_right = tmp_cross_high;
            max_value = tmp_cross_sum;
        }
    }
    return 0;
}

// main.cpp
#include <iostream>
#ifdef __linux
#include <stdio.h>
#endif

#include "find_max_sub_array.h"

using std::cout;
using std::endl;

int B[10] = { 1, -10, 2, 4, 6, -15, 6, 1, 9, -8 };

int main()
{
    cout<<endl;
    int max_left, max_right, max_value;
    Find_MaxiMum_SubArray(B, 0, sizeof(B)/sizeof(int) - 1 , max_left, max_right, max_value);
    cout<< max_left << "\t" << max_right << "\t" << max_value <<endl;
    cout <<endl;
    getchar();
    return 0;
}

dabe755861beac1cbd6adf74c42f6272

转载于:https://www.cnblogs.com/sunyongjie1984/p/4271032.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值