zoukankan      html  css  js  c++  java
  • 分治法求最大最小元素

       问题:在含n个元素的集合中寻找最大值和最小值。

    最常见的做法是:

    max=a[1];
    min=a[1];
    for(i=2;i<=n;i++)
       if(max<a[i])
        max=a[i];
      
    else if(min>a[i])     min=a[i];

    算法中需要比较N-1次,才能得到max,最好的情况是升序,不需要进行与min的比较, 共进行n-1次比较。

    最坏的情况是降序,要经过n-1次比较得到Min,共进行2*n-2次比较,至于在平均情况下,为3(n-1)/2;

    用分治法可以用较少的次数解决上述问题。

    1,将数据等分为2组,目的是分别选取其中的最大值和最小值

    2,递归分解直到每组元素的个数<=2;可简单的找到最大最小值

    3.回溯时合并子问题的解,在两个子问题的解中大者取大,小者取小,既合并为当前问题的解。

    #include<iostream>
    #include<minmax.h>
    using namespace std;
    
    void maxmin(int a[],int &e_max,int &e_min,int low,int high)
    {
        int mid,x1,y1,x2,y2;
        if((high-low)<=1) //若相等,high=low,最大最小都是这个数,可以把这个写出2个
        {
            if(a[high]>a[low])
            {
                e_max=a[high];
                e_min=a[low];
            }
            else
            {
                e_max=a[low];
                e_min=a[high];
            }
        }
        else 
    
        {
            mid=(low+high)/2;
            maxmin(a,x1,y1,low,mid);
            maxmin(a,x2,y2,mid+1,high);
            e_max=max(x1,x2);
            e_min=min(y1,y2);
        }
    }
    int main()
    {
        int a[]={8,3,6,2,1,9,4,5,7};//9个元素
        int low=0;
        int high=8;
        int e_max,e_min;
        maxmin(a,e_max,e_min,low,high);
        cout<<e_max<<ends<<e_min<<endl;
    }
  • 相关阅读:
    python之private variable
    python实例、类方法、静态方法
    python常用option
    access
    FD_CLOEXEC
    fork后父子进程文件描述问题
    split
    信号
    kill
    进程组&Session
  • 原文地址:https://www.cnblogs.com/youxin/p/2486725.html
Copyright © 2011-2022 走看看