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

    用分治法求n个元素集合S中的最大、最小元素(要求每次平分成2个子集)

    void maxmin(int A[], int &e_max, int &e_min ,int low, int high)
    {
    int mid, x1, y1, x2, y2;
    if (high - low <= 1) {             //<=,可能为1个
    if (A[high] > A[low]) {
    e_max = A[high];
    e_min = A[low];
    }
    else {
    e_max = A[low];
    e_min = A[high];
    }
    }    //特征1: 小到容易求解
      else {                     
         mid = (low + high) / 2;           //特征2:可分解 
         maxmin(A, x1, y1, low, mid); //特征4: 子问题独立
        
    maxmin(A, x2, y2, mid + 1, high);
        e_max = max(x1, x2); //特征3: 可合并
         e_min = min(y1, y2);
       }
    }

    分析如下

    #include <stdio.h>
    #include<stdlib.h>
    
    int max(int a, int b)
    {
        return (a > b) ? a : b;
    }
    
    int min(int a, int b)
    {
        return (a < b) ? a : b;
    }
    
    void maxmin(int A[], int &e_max, int &e_min ,int low, int high)
     {
         int mid, x1, y1, x2, y2;
         if (high - low <= 1) {                //<=,可能为1个
             if (A[high] > A[low]) {
                 e_max = A[high];
                 e_min = A[low];
             }
             else {
                 e_max = A[low];
                 e_min = A[high];
             }
         }                                                //特征1:小到容易求解
         else {
            mid= (low + high) / 2;            //特征2:可分解 
            maxmin(A, x1, y1, low, mid);    //特征4:子问题独立
            maxmin(A, x2, y2, mid + 1, high);
            e_max = max(x1, x2);            //特征3:可合并
            e_min =  min(y1, y2);
        }
    }
    
    int main()
    {
        int init[11], max, min;
        for(int i = 1; i <= 10; i ++){
            scanf("%d", &init[i]);
        }
        maxmin(init, max, min, 1, 10);
        printf("%d %d", max, min);
        system("pause");
    }
    
    /* 
    (0 1 3 5 2 4 6 8 9 7),ENTER LEVEL ONE
     1          5                    ENTER LEVEL TWO
     1    3                        ENTER LEVEL THREE
     1 2                            ENTER LEVEL FOUR
     e_max = 1;
     e_min = 0;
     1 2                            EXIT LEVEL FOUR            x1 = 1; y1 = 0;
    
           3
           e_max = e_min =3;
           3                        EXIT LEVEL FOUR            x2 = y2 = 3;
    
           e_max = 3;  -> x1;
           e_min = 0;   -> y1;
     1    3                        EXIT LEVEL THREE            x1 = 1; y1 = 3;
    
              4 5                    ENTER  LEVEL THREE
              x2 = 5;
              y2 = 2;
              e_max = 5;  -> x1;
              e_min = 0;   -> y1;
              4 5                     EXIT LEVEL THREE        x2 = 5; y2 = 2;
    
              e_max = 5;
              e_min = 0;
    1           5                  EXIT LEVEL TWO            x1 = 5; y1 = 0;
    
                    6          10 ENTER LEVEL TWO
                    6    8         ENTER LEVEL THREE
                    6 7            ENTER LEVEL FOUR
                    e_max = 6;
                    e_min = 4;
                    6 7            EXIT LEVEL FOUR            x1 = 6; y1 = 4;
                          8         ENTER LEVEL FOUR
                          e_max = e_min = 8;
                          8         EXIT LEVEL FOUR            x2 = y2 = 8;
                          e_max = 8;
                          e_min = 4;
                    6    8         EXIT LEVEL THREE        x1 = 8; y1 = 4;
                             9 10 ENTER LEVEL THREE
                             e_max = 9;
                             e_min = 7;
                             9 10 EXIT LEVEL THREE        x2 = 9; y2 = 7;
                    6          10 EXIT LEVEL TWO            x2 = 9; y2 = 4;
    
                    e_max = 9;
                    e_min = 0;
    1                           10  EXIT LEVEL ONE        e_max = 9; e_min = 0;
    
    */
  • 相关阅读:
    动手动脑3
    动手动脑2
    编写一个文件分割工具,能把一个大文件分割成多个小的文件。并且能再次把他们合并起来得到完整的文件
    编写一个文件加解密程序通过命令行完成加解密工作
    编写一个程序指定一个文件夹,能自动计算出其总容量
    Java中常见的异常处理汇总
    覆盖 动手动脑
    课堂代码验证
    如何在静态方法中访问类的实例成员 及查询“你已经创建了多少个对象”
    Java的字段初始化规律
  • 原文地址:https://www.cnblogs.com/tomctx/p/2435887.html
Copyright © 2011-2022 走看看