采用分治法求最大子列

 数据结构第一个编程题:用分治法求最大子列(参考陈越《数据结构》)

代码如下:
#include<stdio.h>
 /*
	Name: get the maxsubsequence
	Copyright: 
	Author: demosees
	Date: 22/03/17 11:44
	Description:  (by devc++)
*/

 int Max3(int A,int B,int C)//求三个数中的最大值 
 {
 	return A>B?A>C?A:C:B>C?B:C; 
 }
 int DivideAndConquer(int List[],int left,int right)//分治策略 
 {
 	int MaxLeft,MaxRight;
 	int MaxLeftSum,MaxRightSum;
 	int LeftSum,RightSum;
 	int center,i;
 	  
 	if(left==right)//递归的终止条件 
 	   if(List[left]>0) return List[left];
 	     else return 0;
 	    
		 center=(left+right)/2; //分 
 	     
   MaxLeft=DivideAndConquer(List,left,center);//求左边的最大值 
   MaxRight=DivideAndConquer(List,center+1,right);//求右边的最大值 
   
   MaxLeftSum=0;LeftSum=0;//从中间开始往两边求 
   for(i=center;i>=left;i--){
   
      LeftSum=LeftSum+List[i];
       if(LeftSum>MaxLeftSum)    //从中间往左边扫描 
            MaxLeftSum=LeftSum;
     }       
   
   MaxRightSum=0;RightSum=0;
   for(i=center+1;i<=right;i++){
   
      RightSum=RightSum+List[i];
       if(RightSum>MaxRightSum)  //从中间往右边扫描 
            MaxRightSum=RightSum;
     }    
	 return Max3(MaxLeft,MaxRight,MaxLeftSum+MaxRightSum);//将三个结果合在一起选取最大值 
	         
}

int MaxSubseqSum3(int List[],int N)//把借口转换过去 
{
	return DivideAndConquer(List,0,N-1);
}

    int main()
 {
 	 int subsque[100000],n,j;//输入n个随机的数 
 	 scanf("%d",&n);/*首先输入数的个数*/ 
 	 for(j=0;j<n;j++)
 	    scanf("%d",&subsque[j]);
 	   
 	    printf("%d",MaxSubseqSum3(subsque,n));
     	return 0;
 }	     
 


posted @ 2017-03-22 11:50  jacksin  阅读(645)  评论(0编辑  收藏  举报