zoukankan      html  css  js  c++  java
  • 3.求数组元素中的最大值[分治递归]

    问题提出:求数组A={1,5,7,22,9}中的最大值。
    这种递归非常绕,需要简化来看,比如拿只含两个元素的数组带进去观察。如A={12,25},把问题简化到最简单。

    /*-------完整代码(修改简化)@映雪--------*/
    
    #include <iostream>
    using namespace std;
    #define max(a,b) (((a) > (b)) ? (a) : (b))
    void Max(int a[], int l, int r, int & max)
    {
        if(l == r) /*叶子只有一个元素*/
        {
            max = a[l] ;
            return ;
        }
        if(l + 1 == r) /*叶子有两个元素*/
        {
            max=a[l]>=a[r]?a[l]:a[r];
            return ;
        }
        int m = (l + r) / 2 ; /*中点*/
        int lmax ; /* 左半部份最大值*/
        Max(a, l, m, lmax) ; 
        int rmax;/* 右半部份最大值*/
        Max(a, m + 1, r, rmax) ;
        max = max(lmax, rmax) ; /*最终的最大值*/
    }
    int main()
    {
        int max;
        int a[]={1,5,7,23,78,55,789,342};/*自由修改*/
        Max(a,0,sizeof(a)/sizeof(int)-1,max);
        cout<<"Max="<<max<<endl;
        return 0;
    } 

    另一种精简的算法,来源于《算法:C语言实现》117页

    这种思路简化说明:把一个数组不停的二分对切,只到不能再切为止(切到只有一个元素时),再回溯比较。

    int max(int a[],int l,int r)
    {
    	int u,v,m=(l+r)/2;
    	if(l==r)
    		return a[l];
    	u=max(a,l,m);
    	v=max(a,m+1,r);
    	return u>v ? u : v;
    }
    

      

  • 相关阅读:
    HTML5中drag和drop使用
    E
    D
    杜教BM(解决线性递推式的模板)
    Myeclipse下载安装破解详细版
    D
    IDEA-连接MySQL连不上
    E
    C
    D. Ball(树状数组三维排序,求是否存在三个值都比自己大的人)
  • 原文地址:https://www.cnblogs.com/tinaluo/p/5267402.html
Copyright © 2011-2022 走看看