这个问题其实很容易解决,就是循环遍历一遍数组,然后找到数组中存在的最大值和最小值就可以了,书中主要讨论的问题是比较次数较小的方法,不过,书中已经证明了,无论用什么方法最少的比较次数也就是循环遍历一遍的比较,结果是O(1.5N)的,所以,很容易的可以解决这个问题。

第一种方法:

函数声明:

void DutFindMaxAndMinInArray_1(int*, int, int&, int&);

源代码如下:

/*基本的解法寻找最大值和最小值*/
bool _DutFindMaxAndMinInArray = false;
void DutFindMaxAndMinInArray_1(int* A, int size, int& _max, int& _min)
{if (!A || size <= 0){_DutFindMaxAndMinInArray = true;_max = -1;_min = -1;return;}if (size == 1){_max = A[0];_min = A[0];return;}if (A[0] >= A[1]){_max = A[0];_min = A[1];}else{_max = A[1];_min = A[0];}/*过一遍循环,一次进行比对即可*/for (int i = 2; i < size; ++i){if (A[i] > _max){_max = A[i];}else if (A[i] < _min){_min = A[i];}}
}

然后,我们可以利用分治的解法去解决这个问题,意思就是寻找数组的前一半中的最大值和最小值,寻找数组后一半的最大值和最小值,然后再利用分治把原问题分成更小的问题。

函数声明:

void DutFindMaxAndMinInArray_2(int*, int, int&, int&);
void DutFindMaxAndMinInArray_2(int*, int, int, int&, int&);

源代码如下:

/*分治的方法寻找最大值和最小值*/
void DutFindMaxAndMinInArray_2(int* a, int size, int& max, int& min)
{if (!a || size <= 0){_DutFindMaxAndMinInArray = true;max = -1;min = -1;return;}DutFindMaxAndMinInArray_2(a, 0, size - 1, max, min);
}void DutFindMaxAndMinInArray_2(int* a, int low, int high, int& max, int& min)
{if (high - low <= 1){if (a[high] > a[low]){max = a[high];min = a[low];return;}else{max = a[low];min = a[high];return;}}int maxL, minL;int maxR, minR;/*分别在左半边和右半边寻找最大值和最小值,之后比对两边的最值就可以了*/DutFindMaxAndMinInArray_2(a, low, low + (high - low) / 2, maxL, minL);DutFindMaxAndMinInArray_2(a, low + (high - low) / 2 + 1, high, maxR, minR);if (maxL > maxR){max = maxL;}else{max = maxR;}if (minL > minR){min = minR;}else{min = minL;}
}

接下来,我们来看下书中的扩展问题,即怎样寻找数组中的第二大值。

其实这个问题也是可以利用前面的分治思想,即寻找数组前面的一半符合要求的数值,再寻找数组后面的一半符合要求的数值就可以了。

函数声明:

/*2.10扩展 寻找第二大数值*/
void DutFindMaxAndSecondMax(int*, int, int&, int&);
void DutFindMaxAndSecondMax(int*, int, int, int&, int&);

源代码如下:

/*分治的思想寻找最大值和第二大值*/
bool _DutFindMaxAndSecondMax= false;
void DutFindMaxAndSecondMax(int* a, int size, int& max, int& max2)
{if (!a || size <= 0){_DutFindMaxAndSecondMax = true;max = -1;max2 = -1;return;}DutFindMaxAndSecondMax(a, 0, size - 1, max, max2);
}void DutFindMaxAndSecondMax(int* a, int low, int high, int& max, int& max2)
{if (high - low <= 1){if (a[high] > a[low]){max = a[high];max2 = a[low];return;}else{max = a[low];max2 = a[high];return;}}int maxL, maxL2;int maxR, maxR2;/*找到两边的最大值和次大值,按照比较顺序比较即可*/DutFindMaxAndSecondMax(a, low, low + (high - low) / 2, maxL, maxL2);DutFindMaxAndSecondMax(a, low + (high - low) / 2 + 1, high, maxR, maxR2);if (maxL > maxR){max = maxL;if (maxL2 > maxR){max2 = maxL2;}else{max2 = maxR;}}else{max = maxR;if (maxR2 > maxL){max2 = maxR2;}else{max2 = maxL;}}
}

编程之美2.10 寻找数组中的最大值和最小值相关推荐

  1. 编程之美4:求数组中的最大值和最小值

    方法1:暴力方法 遍历一遍数组,比较2*N次求出最大值和最小值 方法2:改进方法 (破坏了原数组)             遍历一遍数组使得下标为偶数的元素较下标为奇数的元素大,再分别求出最大值和最小 ...

  2. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

  3. 寻找数组中的最大值和最小值

    解法1. 我们可以吧数字中的最大值和最小值看成两个独立的问题分别求出数组中的最大值和最小值. 直接的方法就是扫描数字,找到最大数以及最小数. <span style="font-siz ...

  4. 编程之美-寻找数组中的最大值和最小值方法整理

    [试题描述] 方法一:比较2N次 方法二:比较1.5N次 方法三:比较1.5N次 方法四:分治法,比较1.5N次

  5. 寻找数组中 的最大值最小值

    最简单的方法就是N中的每个数分别和max,min比较,看似2N次比较,其实大于max的就不必和min比较,小于min的也不必和max比较,因此比较的次数不足2N次,程序如下: [cpp] view p ...

  6. Java 数组中找最大值和最小值

    题目描述 计算并输出一维数组中的最大值和最小值. 输入描述 输入一个具有8个数的一维数组 输出描述 输出该数组中的最大值和最小值 输入样例 19.8 12.3 45 67.6 23 15.98 2.5 ...

  7. Java 数组 定义一个数组,获取数组中的最大值和最小值,奇数个数和偶数个数...

    /*** 定义一个数组,获取数组中的最大值和最小值 奇数个数和偶数个数* */ package com.xuyigang1234.chp01;public class Demo8 {public st ...

  8. Java编程定义一个数组,输出数组中的最大值与最小值

    package com.pzhu.demo;public class MaxMin {//Java编程定义一个数组,输出数组中的最大值和最小值public static void main(Strin ...

  9. Java定义一个数组,输出数组中的最大值和最小值

    题目 定义一个数组,输出数组中的最大值和最小值 public class TestArray1 {public static void main(String[] args) {int[] a = n ...

最新文章

  1. Web安全(下)---主动类安全产品技术分析
  2. python的selenium模块博客园_selenium 模块的使用
  3. NYOJ47过河问题
  4. 优酷的多页画在同一窗口打开效果。
  5. 标签中包含input时line-height属性失效的解决办法
  6. for的部分使用方法
  7. JDBC原生连接与连接池介绍
  8. MySQL入门 - 数据库的编辑与备份,DOS与图形界面演示,Navicat软件使用
  9. 龙门飞甲的一点小小感想
  10. 达叔走了,别只发声感叹就完了
  11. JS:利用函数,求任意三个数最大值,任意两个数的任意运算结果,判断任意数值是否为素数。
  12. 服务器丢包率与什么有关?以及常用的丢包解决方法
  13. 巴菲特致股东的一封信:2003年
  14. 魔王语言解释 C++
  15. python24点游戏
  16. macOS - Cocoa开发之沙盒机制及访问Sandbox之外的文件
  17. SLF4J中的桥接器与源码剖析
  18. 学生动物网页设计模板下载 大学生宠物HTML网页制作作品 简单宠物狗网页设计成品 dreamweaver学生网站模板 (1)
  19. wps里有project吗_wps 是否有project或者visol和outlook这种功能?现在不得不用office啊...
  20. 2022年化工自动化控制仪表考试试题模拟考试平台操作

热门文章

  1. 在C++项目中引入Lua(AlphaGo使用的方案)
  2. [Ruby编程语言].弗拉纳根_松本行弘读书笔记
  3. SpringBoot集成全局异常处理
  4. JavaScript导出Excel通用代码。
  5. No-PDO-Models-MySQL数据库层抽象类
  6. 程序员最害怕的5件事 你中招了吗?
  7. BoneCP 学习笔记
  8. gopro 8 black wifi摄像头 导入 obs 直播 解决方案
  9. linux shell sshpass 远程服务器 批量修改密码
  10. python 排序函数 sort sorted 简介