用分治算法求一组数中的最大值、最小值问题

2023-10-26

一、求一个最大值、最小值

1.解题思路

(1)将数据等分为两组(两组数据可能差1),目的是分别选取其中的最大(小)值。
(2)递归分解直到每组元素的个数≤2,可简单地找到最大(小)值。 (3)回溯时,在分解的两组解中大者取大,小者取小,合并为当前问题的解。

2.算法的伪代码描述

float a[n];
maxmin (int  i, int j ,float &fmax, float &fmin)
{ int mid;  
  float lmax, lmin, rmax, rmin;
  if (i=j)  {fmax= a[i];  fmin=a[i];}
  else if (i=j-1)
             if(a[i]<a[j])  { fmax=a[j];fmin=a[i];}
             else {fmax=a[i]; fmin=a[j];}
          else {  mid=(i+j)/2;              
                  maxmin (i,mid,lmax,lmin);               
                  maxmin (mid+1,j,rmax,rmin);                
                 if  (lmax>rmax)    fmax=lmax;
                     else   fmax=rmax;                 
                 if (lmin>rmin)     fmin=rmin;
                     else  fmin=lmin;} 
}

二、求两个最大值、两个最小值

1.解题思路

(1)将数据等分为两组(如果数的个数为奇数的话,两组数的个数会差1),分别求这两组数中的两个最大值和两个最小值
(2)递归分解直到每组数的元素<=4,才可以简单的找出最大值和最小值 (3)最后在两组之中进行比较,大的取大,小的取小,再进行解得合并
(4)递归的出口是:当只有一个数时,四个值都相等
(注意):这四个数的大小关系为 min1<min2<max2<max1

2.算法的伪代码描述

maxmin(a,m,n,min1,min2,max1,max2)
{
    if m==n then   {  min1= min2= max1= max2=a[m];}
    else  if m==n-1 then {
        if a[m]<a[n]  then  {min1=a[m];min2=a[n];max1=a[n];max2=a[m];}
        else  {min1=a[n];min2=a[m];max1=a[m];max2=a[n];}}
 
        else    
    {
            mid=(m+n)/2;
            maxmin(a,m,mid,&lmin1,&lmin2,&lmax1,&lmax2);
            maxmin(a,mid+1,n,&rmin1,&rmin2,&rmax1,&rmax2);
 
       
            if lmin1<rmin1 then 
            {  if lmin2<rmin1 then  {min1=lmin1;min2=lmin2;}
                else  {min1=lmin1;min2=rmin1; }
        }
        else
    { 
            if rmin2<lmin1  then {min1=rmin1;min2=rmin2; }
                else {min1=rmin1;min2=lmin1;}
    }
        if lmax1>rmax1 then 
        {
            if lmax2>rmax1 then {max1=lmax1;max2=lmax2;}
            else {max1=lmax1;max2=rmax1;}
        }
        else
    {
            if rmax2>lmax1 then {max1=rmax1;max2=rmax2;}
            else {max1=rmax1;max2=lmax1;}
        }
}

3.源程序

#include<stdio.h>
#define N 5
 
void maxmin(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2);
 
int main()
{
    int a[N];
    int min1,min2,i,max1,max2;
    printf("输入N个数(在头文件自己定义N的大小):");
    for(i=0;i<N;i++)
    {
        scanf("%d",&a[i]);
    }
    maxmin(a,0,N-1,&min1,&min2,&max1,&max2);
    printf("min1=%d min2=%d max1=%d max2=%d\n",min1,min2,max1,max2);
    return 0;
}
 
void maxmin(int *a,int m,int n,int *min1,int *min2,int *max1,int *max2)
{
    int lmin1,lmin2,lmax1,lmax2;
    int rmin1,rmin2,rmax1,rmax2;
    int mid;
 
    if(m==n)
    {
    *min1=*min2=*max1=*max2=a[m];
    }
 
    else
    if(m==n-1)
    {
        if(a[m]<a[n])
        {
            *min1=a[m];
            *min2=a[n];
            *max1=a[n];
            *max2=a[m];
        }
        else
        {
            *min1=a[n];
            *min2=a[m];
            *max1=a[m];
            *max2=a[n];
        }
    }
 
    else
    {
        mid=(m+n)/2;
        maxmin(a,m,mid,&lmin1,&lmin2,&lmax1,&lmax2);
        maxmin(a,mid+1,n,&rmin1,&rmin2,&rmax1,&rmax2);
 
        if(lmin1<rmin1)
        {
            if(lmin2<rmin1)
            {
            *min1=lmin1;
            *min2=lmin2;
            }
            else
            {
            *min1=lmin1;
            *min2=rmin1;
            }
        }
        else
            if(rmin2<lmin1)
            {
            *min1=rmin1;
            *min2=rmin2;
            }
            else
            {
            *min1=rmin1;
            *min2=lmin1;
            }
 
        
        if(lmax1>rmax1)
        {
            if(lmax2>rmax1)
            {
            *max1=lmax1;
            *max2=lmax2;
            }
            else
            {
            *max1=lmax1;
            *max2=rmax1;
            }
        }
        else
            if(rmax2>lmax1)
            {
            *max1=rmax1;
            *max2=rmax2;
            }
            else
            {
            *max1=rmax1;
            *max2=lmax1;
            }
        }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用分治算法求一组数中的最大值、最小值问题 的相关文章

  • 聚观早报

    聚观365 9月14日消息 iPhone 15系列正式发布 月饼专利申请超10000项 五个女博士 自建研究院 2023中国民营企业研发十强公布 华为和小米达成全球专利交叉许可协议 iPhone 15系列正式发布 2023年苹果秋季新品发布
  • hook库

    detourattach detourRestoreAfterWith detourTransactionBegin detourUpdatethread getcurrentthread
  • 使用ChatGPT生成代码

    无需翻墙 1 下载安装cursor 首先进入官网 https www cursor so 点击 Download for windows 下载并安装好cursor 2 使用方法 打开后界面如下 打开 py或者 json文件 然后点击按键盘

随机推荐

  • echarts初始化宽度小于容器宽度

    查找资料是因为echarts的容器还没有创建出来的时候echarts就已经加载出来了 因为获取不到容器的宽高就会默认宽高100 是100px 所以会缩小在一起 因为我的代码中 echarts的容器的最外层的div给的样式是display n
  • 分布式事务学习总结

    1 基础概念 1 1 什么是事务 事务可以看做是一次大的活动 它由不同的小活动组成 这些活动要么全部成功 要么全部失败 1 2 本地事务 在计算机系统中 更多的是通过关系型数据库来控制事务 这是利用数据库本身的事务特性来实现的 因此叫数据库
  • echarts报错:Error in mounted hook: “TypeError: Cannot read properties of undefined (reading ‘init‘)“

    echarts安装创建图表时报这种错误 Error in mounted hook TypeError Cannot read properties of undefined reading init 1 具体报错内容 2 解决办法 原先大
  • Java基本数据类型

    Java中有以下几种基本数据类型 这些类型都是值类型 类型 值范围 大小 范围 boolean true或false 1位 char Unicode字符 16位 u0000 uFFFF byte 有符号整数 8位 128 127 short
  • [Linux打怪升级之路]-环境变量

    前言 作者 小蜗牛向前冲 名言 我可以接受失败 但我不能接受放弃 如果觉的博主的文章还不错的话 还请点赞 收藏 关注 支持博主 如果发现有问题的地方欢迎 大家在评论区指正 目录 一 认识环境变量 二 获取环境变量的三种方法 1 通过gete
  • 贝叶斯分类器(贝叶斯决策论,极大似然估计,朴素贝叶斯分类器,半朴素贝叶斯分类器,贝叶斯网)学习笔记

    贝叶斯分类器 贝叶斯决策论 极大似然估计 朴素贝叶斯分类器 半朴素贝叶斯分类器 贝叶斯网 学习笔记 一 条件概率 全概率公式 贝叶斯公式 二 贝叶斯决策论 贝叶斯决策论是概率框架下实施决策的基本方法 对分类任务来说 在所有相关概率都已知的理
  • wsl2 网络代理设置

    在 WSL2 环境中 clone 一个很大的 git 项目 不走代理速度很慢 所以研究了一下怎么让 WSL2 走 Windows 的代理客户端 WSL1 和 WSL2 网络的区别 在 WSL1 时代 由于 Linux 子系统和 Window
  • Android开发 retrofit入门讲解 (RxJava模式)

    Android开发 retrofit入门讲解 RxJava模式 前言 retrofit除了正常使用以外 还支持RxJava的模式来使用 此篇博客讲解如何使用RxJava模式下的retrofit 依赖 implementation com s
  • 极光笔记

    作者 极光推送后台技术专家 曾振波 为什么要上云 关于企业上云 业内已经有了非常多的讨论和论述 这里主要是从极光自身的实际情况阐述几个理由 1 传统自建机房在扩充底层软硬件资源时 需要进行选型 采购 参数测试验证 实施部署等流程 整个过程需
  • jupyter 魔法命令

    Jupyter NoteBook 是功能强大的Python交互IDE 深受数据分析师和算法工程师的热爱 Jupyter NoteBook 在综合使用文字 代码 图片等多种元素展示设计者的想法方面有着美妙的用户体验 而其自带的一些常用Magi
  • 【项目实战】springboot+uniapp基于微信小程序铁路订票小程序-源码+数据库+文档报告

    注意 该项目只展示部分功能 如需了解 评论区咨询即可 本文目录 1 开发环境 2 系统设计 2 1 设计背景 2 2 设计内容 3 系统页面展示 3 1 前台页面 3 2 后台页面 3 3 功能展示视频 4 更多推荐 5 部分功能代码 1
  • Makefile的编译方式

    Makefile 使用GCC的命令进行程序编译时 当程序是单个文件时编译是比较方便的 但当工程中的文件数目增多 甚至非常庞大 并且目录结构关系复杂时 便需要通过makefile来进行程序的编译 示例 目录MakeFile Demo下有三个文
  • CSS

    一 是什么 css 即层叠样式表 Cascading Style Sheets 的简称 是一种标记语言 由浏览器解释执行用来使页面变得更美观 css3是css的最新标准 是向后兼容的 CSS1 2的特性在CSS3 里都是可以使用的 而CSS
  • 嵌入式零树小波EZW编码及其算法改…

    在基于小波变换的图象压缩方案中 嵌入式零树小波 EZW Embedded Zerotree Wavelets 1 编码很好地利用小波系数的特性使得输出的码流具有嵌入特性 近年来 在对EZW改进的基础上 提出了许多新的性能更好的算法 如多级树
  • nohup command 2>&1 &的解释

    nohup的作用是让命令永久执行 哪怕当前终端已经退出登录 而 的作用是后台执行 因此 nohup command 的意思是 永久执行command 并且是在后台执行 至于2 gt 1的作用 在bash shell中 0代表标准输入 一般是
  • Java 退出循环的几种方式

    第一种 使用break退出正在循环的循环 while true break 第二种 对循环命名 使用break退出指定循环 loop while true while true break loop 第三种 使用System exit 0
  • 抖音seo矩阵系统源码开发技术

    抖音seo矩阵系统源码开发技术要求十分严格 首先 需要熟练掌握Python Java等编程语言 具有扎实的算法基础 在此基础上 还需要具备深度学习 神经网络等相关技能 能够实现精准推荐和内容分析等功能 其次 抖音seo矩阵系统开发还需要专业
  • shell脚本冒泡排序法——排列数组的从大到小和从小到大(有详细解释)

    文章目录 一 冒泡排序基础 1 2冒泡排序 1 2基本思想 1 3算法思路 1 4冒泡排序案例图解 二 实际操作 2 1升序 2 2升序 一 冒泡排序基础 1 2冒泡排序 类似于气泡上升的动作 会将数据在数组中从大到小或者从小到大不断地向前
  • Redis介绍

    一 简介 Redis是互联网技术领域使用最为广泛的存储中间件 它是 Remote Dictionary Service 远程字典服务 的首字母缩写 由意大利人Salvatore Sanfilippo 网名 Antirez 开发 默认端口 6
  • 用分治算法求一组数中的最大值、最小值问题

    一 求一个最大值 最小值 1 解题思路 1 将数据等分为两组 两组数据可能差1 目的是分别选取其中的最大 小 值 2 递归分解直到每组元素的个数 2 可简单地找到最大 小 值 3 回溯时 在分解的两组解中大者取大 小者取小 合并为当前问题的