分治法实现寻找数组最大最小值

大致思路

我们拿到一个长度为K的一维数组,想要在短时间内进行最大最小值的查找,第一种想法就是现将数组进行排序,这样首末的元素分别是最小和最大的元素。排序算法中,快速排序、归并排序、堆排序等排序算法的时间复杂度都是O(nlogn),第二种想法就是建立堆,但是需要分别建立最小值堆和最大值堆,我们可以采取第三种做法,将整个数组进行一次次的二分,直到二分后的结果只有两个元素,比较取出最小值或者最大值,采用这种分治的方法可以快速有效的寻找到最大值和最小值,时间复杂度为O(logn)
下面是C++的具体实现:

#include <iostream>
using namespace std;
int least(int* array,int start,int ends){//前两个条件是递归终止条件。if (ends == start){return array[start];}else if (ends - start == 1){return (array[start] < array[ends]) ? array[start] : array[ends];}else{int mid = (ends + start) / 2;//开始进行二分,计算这个数组的中间位置int left = least(array,start,mid);//分治递归计算左边数组的极值int right = least(array,mid,ends);//分治递归计算右边数组的极值return (left < right) ? left : right;//if ( least(array,start,mid) < least(array,mid,ends) ){//return least(array,start,mid);//}//else{//  return least(array,mid,ends);//}}
} int most(int* array,int start,int ends){//与上面的基本相同,更改运算符if (ends == start){return array[start];}else if (ends - start == 1){return (array[start] > array[ends]) ? array[start] : array[ends];}else{int mid = (ends + start) / 2;int left = most(array,start,mid);int right = most(array,mid,ends);return (left > right) ? left : right;//if ( least(array,start,mid) > least(array,mid,ends) ){// return least(array,start,mid);//}//else{//  return least(array,mid,ends);//}}
} int main(){int length;cin >> length;int array[length];for (int i = 0;i < length; i++){cin >> array[i];} int max = most(array,0,length-1);int min = least(array,0,length-1);cout << "The max is "<< max << "\n";cout << "The min is "<< min << "\n";return 0;
}

分治法实现寻找数组最大最小值相关推荐

  1. 分治法之一维数组求和问题

    分治法的设计思想 分治者,分而治之也①.分治法(divide and conquer method)将一个难以直接解决的大问题划分成一些规模较小的子问题,分别求解各个子问题,再合并子问题的解得到原问题 ...

  2. 分治法实验-寻找第k小元素

    问题描述 随机生成含有n个不同元素的数组L(n≥10000),要求找出第k小的元素(k≤n),完成下面的任务: (1)设计一个基于排序选择算法程序,编程调试正确(排序算法自己确定). (2)设计一个时 ...

  3. 查找数组元素最大值和最小值(分治法)

    1. 问题 给定一个数组,要求找出数组中的最大值和最小值,假设数组中的值两两各不相同 2. 思路 2.1 首元素比较法 定义变量 max.min , 分别将第一个元素分别赋值给这两个变量,然后依次遍历 ...

  4. 分治法查找数组元素的最大值和最小值(python实现)

    实验内容 给定任意几组数据,利用分治法的思想,找出数组中的最大值和最小值并输出 实验原理 利用分治法,将一个数组元素大于 2 的数组分成两个子数组,然后对每一个子数组递归调用,直到最小的子数组的元素个 ...

  5. 算法设计思想(4)— 分治法

    1. 分治法概念 分治,顾名思义,分而治之. 具体来说,它先将一个难以直接解决的大问题,分割成一些可以直接解决的小问题.如果分割后的问题仍然无法直接解决,那么就继续递归地分割,直到每个小问题都可解. ...

  6. 分治法 第2关:求一组数据的和

    任务描述 本关任务:利用分治法求一组数据的和. 编程要求 请在右侧编辑器Begin-End处补充代码,完成本关任务,注意需要学生自己获取输入数据再进行操作. 测试说明 平台会对你编写的代码进行测试,比 ...

  7. [python] 分治法查找数组元素的最大值和最小值

    分治法查找数组元素的最大值和最小值 分治法简介: 分治法从字面上的解释是"分而治之",就是把一个复杂的问题分成两个或者更多相同或者相似的子问题,再把子问题分成更小的子问题,直到最后 ...

  8. 算法设计——用分治法查找数组元素的最大值和最小值、用分治法实现合并排序、最小费用问题、树的最大连通分支问题(代码实现)

    代码链接:pan.baidu.com/s/15inIth8Vl89R1CgQ_wYc2g  提取码:gf13 算法分析与设计第 1 次实验 时间 2020.3.31 地点 软件大楼 127 实验名称 ...

  9. 用分治法设计一个算法,在数组A中寻找最大元素和最小元素 Java代码

    算法分析与设计作业-- 用分治法设计一个算法,在数组A中寻找最大元素和最小元素 public class b1113 {static int min=Integer.MAX_VALUE;static ...

最新文章

  1. 【每日学习Mybatis中基础】trim标签使用
  2. python类型-Python数据类型详解
  3. redhat6.4中手动创建oracle11g数据库
  4. 明明白白你的Linux服务器——日志篇
  5. 服务器端接华为sdk无响应,sdk未响应
  6. vue 多页面多模块分模块打包 分插件安装_Vue渲染方式
  7. 便携式计算机推销洽谈方案,推销洽谈的方法
  8. nmake错误:VC\bin\cl.EXE: 返回代码“0xc0000135“
  9. ======第三章处理机调度与死锁======
  10. Redis 集群原理
  11. 【metasploit】1 渗透测试与metasploit基础介绍 [PTES|msf|armitage安装]
  12. 适合入门的linux教程,Linux入门记录系列教程,适合Linux初学者阅读
  13. 01 社会网络分析基础理论!
  14. Windows7配置docker配置registry-mirrors国内镜像地址,运行hello-world
  15. netbeans如何导入java项目_netbeans导入java项目
  16. 交换机的Zoning技术
  17. 艾司博讯:拼多多增加自然访客的方法是什么?
  18. 《为什么精英都是时间控》读书总结
  19. 硬件知识andl linux发展历史
  20. 华为电脑管家安装后,只能有线连接,没有无线连接选项的解决办法,华为电脑管家无法连接网络用这个方法也可以解决

热门文章

  1. 干货!MetaCorrection:解决无监督域适应的domain gap问题
  2. Android 输入法显示图标
  3. SSM网约车管理系统毕业设计源码051630
  4. (一)Reactor模式详解
  5. docfx 做一个和微软一样的文档平台
  6. 支付宝等第三方支付原理与概述
  7. matcher.group() 的基本使用,matcher分解系列(一)
  8. 域格4G模块TTS语音使用方法
  9. 无法打开“kdiff3”,因为Apple无法检查其是否包含恶意软件。
  10. python 条形图填充疏密_教你利用Python玩转histogram直方图的五种方法