【编程之美】读书笔记:寻找数组中的最大值和最小值

算法学习---求数组中的最大数 给定一个数组,取出这个数组中的最大数: C语言实现: 1: #include 2:  3: int getMaxNum(int a[],int length) 4: { 5: int max = 0 ; 6: if(length 阅读详情
        问题:对于一个由N个整数组成的数组,需要比较多少次才能把最大值和最小值的数找出来呢?

        

       解法一:将寻找数组中的最大值和最小值看成是两个独立的问题。分别求出最大值和最小值即可。这样需要2*N次的比较才能求出最大的数和最小的数。

void FindMinMax(int A[],int size,int &min,int &max)
{
	min=A[0];
	max=A[0];
	for(int i=1;i<size;i++)
	{
		if(A[i]>max)
			max=A[i];
		if(A[i]<min)
			min=A[i];
	}
}

        解法二:由于最大的数和最小的数不会是同一个数(N!=1),可以把数组分成两部分,然后再从这两部分中分别找出最大的数和最小的数。首先按顺序将数组中相邻的两个数分在同一组,接着比较同一组中奇数位数字和偶数位字,将较大的房子偶数位上,较小的数放在奇数位上,经过N/2次比较的预处理后,较大的数都放到了偶数位置上,较小的数则放到了奇数位置上,最后从奇偶数位上分别求出Max和min,各需要比较N/2次。整个算法共需要比较1.5*N次。

void FindMinMax(int A[],int size,int &min,int &max)
{
         max=-INF;
	 min=INF;
	for(int i=0;i<size-1;i++)
	{   
		if(A[i]<A[i+1])
		{
                 int temp=A[i];
		  A[i]=A[i+1];
		  A[i+1]=temp;
		}
		if(A[i]>max)
			max=A[i];
		if(A[i+1]<min)
			min=A[i+1];
	}
}


          解法三:解法已经将比较次数降低到1.5N次,但是它已经破坏原来的数组。可以不需要调整数组元素的位置,直接用两个变量Max和Min来存储当前的最大值和最小值。同一组的两个数比较之后,不再调整顺序,而是用较小者与当前的Min比较,如果该数小于当前Min,则更新Min。Max同理。该算法的比较次数扔为1.5N.
void FindMinMax(int A[],int size,int &min,int &max)
{
      max=-INF;
     min=INF;
	for(int i=0;i<size-1;i++)
	{   
		if(A[i]<A[i+1])
		{
          if(A[i+1]>max)
			max=A[i+1];
		if(A[i]<min)
			min=A[i];
		}
		else
		{
         if(A[i]>max)
		max=A[i];
	 	if(A[i+1]<min)
			min=A[i+1];
		}
			
	}
	
}


        解法四:采用分治法。在N个数中求最小值Min和Max,只需要分别求出前后N/2个数的Min和Max,然后比较较小的Min,和较大的Max即可。
void FindMinMax(int A[],int low,int high,int &min,int &max)
{
	 int maxL,maxR,minL,minR;
    if(high-low<=1)
	{
		if(A[low]<A[high])
		{
			min=A[low];
			max=A[high];
			return ;
		}
		else
		{
     	       min=A[high];
		max=A[low];
		return ;
		}
			
	}
FindMinMax(A,low,low+(high-low)/2,minL,maxL);
FindMinMax(A,low+(high-low)/2+1,high,minR,maxR);


if(maxL>maxR)
max=maxL;
else
max=maxR;


if(minL<minR)
min=minL;
else
min=minR;
}


该算法的比较次数为1.5N-2次,对于分治法,总的比较次数仍然没减少。


扩展问题:如果需要找出N个数组中第二大数,需要比较多少次?
int FindSecondMax(int A[],int size)
{
  int i=0;
  int Max = A[0];
  int secondMax;
  
  for(i=1;i<size;i++)
  {
   if(Max <= A[i])
   {
    secondMax = Max;
    Max= A[i];
   }
   else
   {
    if(secondMax <=A[i])
    {
     secondMax = A[i]; 
    }
   }
  }
  return secondMax;
}


该算法的时间复杂度为O(N)。
已知一个int数组, 编程从数组中获取最大数 已知一个int数组, 编程从数组中获取最大数,初学者,不知道是否正确。 立即下载

相关推荐

java 从int数组中获取最大数的方法

主要介绍了java 从int数组中获取最大数的方法,需要的朋友可以参考下

获取一维数组的最大值

【1】 学会定义和使用一维数组 【2】 学会使用数组作方法的参数 请编写程序,实现获取数组{22,24,76,12,21,33}的最大数。 要求:求数组中的最大值通过定义一个方法来实现,在main方法中调用该方法获取这组数的最大值。 知识提示: 一维数组的定义下面几种形式都可以: 【1】 int [] arr=new int[6]; 【2】 int[] arr= new int[]{ 22,24,76,12,21,33 }; 【3】 int[] arr= { 22,24,76,12,21,33 };

Sky____________的博客 1万+

HRNet 【demo 复现过程】

Deep High-Resolution Representation Learning for Human Pose Estimation

qq_45257495的博客 5556

找出一维数组中最大的数

找出一维数组中最大的数 #include<iostream> using namespace std; int main() { int arr[5] = { 1,2,8,4,5 }; int max = 0; for (int i = 0; i < 5; i++) { if (arr[i] > max) { max = arr[i]; } } cout << "最大的数:" << max << endl; return

qq_33858808的博客 1466

磁编码器选型避坑指南:为什么MT6816比霍尔传感器更适合你的伺服系统?

本文深入对比了MT6816磁编码器与传统霍尔传感器在伺服系统中的应用。MT6816基于AMR技术,对磁场方向敏感而非强度,具备高精度、强抗干扰、高安装容差和极低延时等优势,尤其适合高转速、恶劣环境下的工业场景,能有效提升系统可靠性与长期稳定性。

rainy的博客 1102

AFSim 2.9实战指南:从入门到精通的中文教程

本文是AFSim 2.9的实战指南,提供从零开始的中文教程。内容涵盖仿真环境搭建、实体行为控制、脚本编写,到传感器、武器系统集成与复杂想定构建,最后讲解数据记录与结果分析方法,帮助用户快速掌握这一强大的军事仿真框架。

weixin_29281941的博客 943

编程之美读书笔记2.10—寻找数组中的最大值和最小值

1.先扫描一遍数组找到最大值,然后再扫描一遍找到最小值,共2*N次 2.把数组分成两部分,然后从这两部分中分别找出最大值和最小值。 首先相邻的两个数分子啊同一组中,例如{5,6,8,3,7,9},分为5 6, 8 3, 7,9 然后偶数位调换为较大的数,相应的奇数位为较小值     6 5, 8 3,  9,7     需0.5次 最后比较偶数位得到最大值9 ,比较奇数位得到最小值3,需要

yuhan_9204的专栏 643

OpenCV实战:5分钟搞定图像拼接(附Python代码)

本文通过OpenCV实战教程,详细讲解如何使用Python在5分钟内完成图像拼接。重点介绍`findHomography`函数和单应性矩阵的应用,提供完整的代码示例和常见问题解决方案,帮助开发者快速掌握图像拼接技术。

weixin_26833503的博客 120

读书笔记之编程之美 - 2.10 寻找数组中的最大值和最小值

这个问题书中似乎也没有给出特别有效的解法。解法一算不上是答案,因为这是最差的解法。对于解法二,不知道为什么整个算法共需比较1.5N次,应该是略比这个小一点,也是1.5N-2。同理解法三和解法二类似,只是不用交换数组的内容,这种算法的复杂度好像确实是1.5N。如前面的分析,解法四和解法二的算法复杂度一样。 扩展问题: 如果找数组中第二大数,我想就不能采用分治的思想了,因为分成左右两堆,第二大的数也许和第一大的数在一起。既然只找一个,遍历一遍N次就可以了。

山高月小 939

【乐企文件生成工程】关于乐企文件生成工程的详细介绍

发票文件生成方式有两种思路:1、根据已有的OFD模板,动态替换ofd模板内容;之后将ofd转pdf(局限:单行问题不大)详情可以在此处了解2、根据html模板动态占位:该工程就是这种方式 ,目前效果良好,可看下图。拿去即用的源码!无任何保留,当然也并不是所有票种都支持(时间有限、精力有限、已经连着转了,要冒烟了…)

九七的博客 2030

二、Windows安装Docker到非C盘的全新教程(Windows版)

Windows安装Docker到非C盘的全新教程(Windows版)

funfan的博客 4万+

[读书笔记]编程之美(二)

[读书笔记]编程之美(二)2.1求二进制数中1的个数 问题:对于一个字节(8bit)的无符号整形变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。 思路: n = n & (n-1);当然因为只有8bit所以直接定义一个256的int数组表,直接返回结果,时间复杂度是O(1)。2.2不要被阶乘吓到 问题:1.给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=362

xy_cpp的博客 569

拼多多全站商品SKU数据爬虫实战:Python自动化采集与清洗

在电商数据分析领域,SKU(Stock Keeping Unit,库存量单位)数据是洞察商品策略、价格体系和市场竞争格局的核心抓手。本文以拼多多平台为研究对象,系统讲解如何利用Python构建一套完整的全站商品SKU自动化采集与清洗流程。文章涵盖目标分析与反爬策略、网络请求模拟、数据解析、分布式存储、数据清洗与标准化,以及调度与运维等全链路环节,并提供可直接运行的代码示例。拼多多API返回的数据结构大致如下(已脱敏):json"goods_name": "某品牌运动鞋",

2201_76125261的博客 216

无序数组中求最大值和最小值的最少比较次数

无序数组中求最大值和最小值的最少比较次数 原理介绍 求一个无序数组中的最大值和最小值是一个很常见的情况, 一般来说, 最大值和最小值不是同一个元素, 我们可以通过下面几种方法来求: 排序算法:将数组排序后, 第一个元素是最小值,最后一个元素是最大值,以快排平均复杂度为例,时间复杂度 O(NlogN)O(NlogN)O(NlogN),空间复杂度: O(logN)O(logN)O(logN),比较...

Fxxk CPP 2288

Pinocchio 快速详细入门教程 —— 开源机器人运动学动力学库

本文介绍了机器人学中的数字机器人学、正逆运动学、动力学仿真与控制、最优控制等核心主题,以及Pinocchio库的应用。内容包括: 数字机器人学:通过UR5机器人模型演示了构型空间采样、碰撞检测、路径规划等基础操作,使用优化方法在约束条件下寻找有效构型。 运动学:详细讲解了二维和三维机器人的正运动学(构型到末端位置)和逆运动学(目标位置到构型),包括串联机械臂和并联机器人的处理。 动力学与控制:介绍了动力学仿真(如自由落体、摩擦效应)、PD控制、计算扭矩控制,以及接触仿真(碰撞检测与处理)。 最优控制:以独轮

机器人控制与仿真应用 2883

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

编程之美读书笔记_2.5 寻找最大的K个数

2.5 寻找最大的K个数从n个数中寻找最大的k个数,两种思路:1 保存目前找到的最大k个数,每访问一个数,就与这k个数中的最小值比较,决定是否更新这k个数。储存k个数的数据结构可采用:败者树、二叉查找树、最小堆。C++ STL提供了multiset和priority_queue容器,另外还提供了make_heap,push_heap,pop_heap方便手动构建堆结构。(测试发

flyinghearts的专栏 2731

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《编程之美》读书笔记07: 2.5 寻找最大的K个数

《编程之美》读书笔记07: 2.5 寻找最大的K个数 问题: 从n个数中找出最大的k个数。 两种思路: 1 保存目前找到的最大k个数,每访问一个数,就与这k个数中的最小值比较,决定是否更新这k个数。储存k个数的数据结构可采用:败者树、二叉查找树、最小堆。 C++ STL提供了multiset和priority_queue容器,另外还提供了make_heap,push_heap,pop_h...

weixin_34100227的博客 92

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《编程珠玑》读书笔记之冒泡排序

第一章 排序 公共函数swap 待排序序列 function swap(arr,a,b){ arr[a] = arr[a]^arr[b] arr[b] = arr[a]^arr[b] arr[a] = arr[a]^arr[b] } 冒泡排序 function BubbleSort(arr){ let len = arr.length let flag=true for( let i = 0...

mwl1711883743的博客 240

《编程之美》读书笔记15: 4.5 磁带文件存放优化

《编程之美》读书笔记15: 4.5 磁带文件存放优化 对一个已经是最优解的排列,记第i个文件的长度为Bi,被访问概率为Ai。如果交换第i个和第i+1个文件,则平均长度一定不会变小,交换后,访问原第i个文件时,要多访问一个原第i+1文件,长度增加了Ai*Bi+1,而访问原第i+1个文件时,要少访问一个原第i个文件,长度减少了Ai+1*Bi,而访问这两个文件之前和之后的文件,长度没有改变,故有:...

weixin_34055910的博客 83

flyinghearts《编程之美》读书笔记连载(7)

 2.5 寻找最大的K个数从n个数中寻找最大的k个数,两种思路:1 保存目前找到的最大k个数,每访问一个数,就与这k个数中的最小值比较,决定是否更新这k个数。储存k个数的数据结构可采用:败者树、二叉查找树、最小堆。C++ STL提供了multiset和priority_queue容器,另外还提供了make_heap,push_heap,pop_heap方便手动构建堆结构。(测试发现

BOPGroup的专栏 828

CATALOGUE 目录

1 语言基础 1.1 c/c++ 【转】C/C++ 存储类型 作用域 连接类型 【转】C/C++内存划分 【转】C/C++除法实现方式及负数取模详解 【转】为什么C++编译器不能支持对模板的分离式编译 C/C++:原码、反码和补码 C/C++:拷贝构造函数 C/C++:类模板 1.2 linux C linux内核-双向链表 linux内核-红黑树 ...

weixin_30604651的博客 317

《数据结构与算法JavaScript描述》读书笔记

总的来说,书的质量不太高,如果作为前端工程师算法入门的书的话,不如去读《算法图解》,相比之下更容易理解,讲解也更加准确。这本JavaScript描述只是用了JavaScript去实现一些基础算法,而且实现的也不是很令人满意。

多啦的博客 512

《程序员代码面试指南》Python实现(个人读书笔记)

说明  最近一直在读左神的书——《程序员代码面试指南—IT名企算法与数据结构题目最优解》,为了记录自己的学习成果,并且方便以后查看,将自己读书时的想法与使用python实现的代码记录在此博客。   >>>github代码地址>>>栈和队列 设计一个有getMin功能的栈 由两个栈组成队列 如何仅用递归函数和栈操作逆序一个栈 用一个栈实现另一个栈的排序 生成窗口最大值数组 构造数组的MaxTree

冰殇的博客 1万+

读书笔记:“集体智慧编程”之第三章:“发现群组”的 k均值聚类

分级聚类的缺点 此前学习的分级聚类、与列聚类,有二个缺点: 计算量大的惊人,数据越大运行非常缓慢。没有确切的将数据分成不同的组,只是形成了树状图。虽然我倒觉得如果写过多的代码这一点还是可以搞定的。 k均值聚类可以应对上述两种缺点,我们会预先告诉算法生成的聚类数量,也就是我要产生几个类。 原理 如下图所示,对于5个数据项和两个聚类 过程是这样的,先随机产生两个聚类点,

zy825316的专栏 1540
上一篇: 【编程之美】读书笔记:从无头单链表中删除结点
下一篇: 【面试题】把二元查找树转变成排序的双向链表
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值