| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
《算法导论(第三版)》第四章4.1,使用分治策略求最大子数组问题。( u5 o5 u# a$ X+ U% s7 | 
 
& M% ~9 I/ b# D/ U主函数:# }$ _4 s+ a* D 
- clear;clc
 - A=[13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7];%例 源数组
 - [low,high,sum1]=FIND_MAXIMUM_SUBARRAY(A,1,length(A))%求解
 - A(low:high)%展示结果
  
& m/ i' B' ^( L/ L$ E ! W8 K) `* r0 k+ c 
4 n% n/ x4 l  Z3 d$ z0 r% o/ u0 B 
 
  W$ s! }% e: ]5 @递归函数:; u; s; t+ ?" r 
- function [low,high,sum1] = FIND_MAXIMUM_SUBARRAY(A,low,high)
 - %输入,[源数组,左边界,右边界]
 - %输出,[左边界,右边界,边界内最大子数组的和]
 - if low==high %两侧仅剩单个数值时,直接返回数字
 -     sum1=A(low);
 - else %如果不是单个数字,则进行递归分解成三部分
 -     mid=floor((low+high)/2);%定义中间值
 -     [left_low,left_high,left_sum]=FIND_MAXIMUM_SUBARRAY(A,low,mid);%分解左子数组,并求子数组的值
 -     [right_low,right_high,right_sum]=FIND_MAXIMUM_SUBARRAY(A,mid+1,high);%分解右子数组,并求子数组的值
 -     [cross_low,cross_high,cross_sum]=FIND_MAX_CROSSING_SUBARRAY(A,low,mid,high);%求出跨界子数组的值
 -     %将三种结果做比较,返回最大的情况
 -     low=[left_low,right_low,cross_low];
 -     high=[left_high,right_high,cross_high];
 -     sum1=[left_sum,right_sum,cross_sum];
 -     [sum1,addr]=max([left_sum,right_sum,cross_sum]);%
 -     low=low(addr);
 -     high=high(addr);
 - end    
 - end
 - 8 K, Y* m6 h7 B* @$ w0 p3 u4 S
 
  % o$ j! W# T9 H: I8 ` 
[color=rgb(51, 102, 153) !important]复制代码4 A7 M5 u( l/ [! B1 Q6 o' u 
0 e# C- r% M. L! S 
求解函数: 
  ~3 S2 r8 T% W# e& n( {( F- function [max_left,max_right,sum3] = FIND_MAX_CROSSING_SUBARRAY(A,low,mid,high)
 - %求左侧的最大子数组
 - left_sum=-inf;%最大子数组的和
 - sum1=0;%子数组和的累计
 - for i=mid:-1:low%序数
 -     sum1=sum1+A(i);%累计
 -     if sum1>left_sum%判断最大子数组
 -         left_sum=sum1;%最大子数组的值
 -         max_left=i;%最大子数组的左侧截止位置
 -     end
 - end
 - %求右侧的最大子数组
 - right_sum=-inf;%最大子数组的和
 - sum2=0;%子数组和的累计
 - for j=mid+1:high
 -     sum2=sum2+A(j);
 -     if sum2>right_sum
 -         right_sum=sum2;
 -         max_right=j;%最大子数组的右侧截止位置
 -     end
 - end
 - sum3=left_sum+right_sum;%两侧最大子数组之和
 - end
 - % V/ L- ~1 t0 U; Y- ~( j
 
 
  
! b1 M4 G; q9 U2 h; u' ^0 Q; k8 p 
' n, m0 a% {5 ~! O( R$ p/ E 
 |   
 
 
 
 |