编程之美 2.10寻找数组中的最大最小值

数组是最简单的一种线性数据结构,当得到一个数组,需要找出最大最小值的时候,通过什么样的方法可以高效的,找出最大最小值呢。对于一个N个整数组成的数组,需要比较多少次呢。

现在有一个N=8的数组{5,6,8,3,7,9,1,2}。

解法一:

将找最大和最小数看成2个独立的问题,分别求解,需要遍历数组2次,共需要2N次操作。

 1 #include "iostream"
 2 using namespace std;
 3 void Search_max_and_min(int* a,int N){
 4     int max,min;
 5     max=min=a[0];
 6     for(int i=0;i<N;i++){
 7         if(a[i]>max)
 8             max=a[i];
 9             else if(a[i]<min)
10                 min=a[i];
11     }
12     cout<<"max="<<max<<endl;
13     cout<<"min="<<min<<endl;
14 }
15 int main(){
16     int data[] = {10, 8, 9, 7, 4, 5};
17     int length=sizeof(data)/sizeof(data[0]);
18     Search_max_and_min(data,length);
19 }

解法二:

通常情况最大和最小数不会是一个数,除非N=1或者数组所以元素相等。

首先将相邻的2个数放在同一个组里面(概念上的组),{(5,6)(8,3)(7,9)(1,2)},然后比较相邻的数,将较小的放在基数位,较大的放在偶数位,{(5,6)(3,8)(7,9)(1,2)},比较了N/2次,得到的新数组,我们分别比较所有基数位元素和所有偶数位元素,Max只可能在偶数位上,Min只可能在基数位上。然后分别比较{5,3,7,1}和{6,8,9,2}各N/2次,max=9,min=1,整个算法共比较1.5N次;

注意:此方法必须满足条件,N为偶数,N为基数的时候可能会得不到正确答案如N=5,{3,4,3,4,5},基数{3,3,5},偶{4,4},max=4,min=3。解法二三都没有分技术情况,在实际过程中是需要考虑的。

解法三:

解法二中破坏了原数组,我们使用新方法,在不破坏原数组的情况下, 进行遍历,仍将相邻的2个数放在同一个组里面(概念上的组),{(5,6)(8,3)(7,9)(1,2)},然后使用变量Max和Min存放当前最大最小的数,首先比较第一个第二个数,将大数存入Max,小数存入Min,接下来第二组(8,3)进行比较知道a[3]=8大,a[4]=3小,将小数与min比较,小于当前Min则更新,Max同理。

 1 #include "iostream"
 2 using namespace std;
 3 void Search_max_and_min(int* a,int N){
 4     int max,min,tmax,tmin;
 5
 6     if(N%2==0){
 7         max=(a[0]>a[1])?a[0]:a[1];
 8         min=(a[0]<a[1])?a[0]:a[1];
 9     }
10     else
11         max=min=a[0];
12     for(int i=1;i<N/2;i++){
13         if(a[2*i-1]>a[2*i]){
14             tmax=a[2*i-1];
15             tmin=a[2*i];
16         }
17         else{
18             tmax=a[2*i];
19             tmin=a[2*i-1];
20         }
21         if(tmax > max)
22             max = tmax;
23         if(tmin < min)
24             min = tmin;
25
26     }
27     cout<<"max="<<max<<endl;
28     cout<<"min="<<min<<endl;
29 }
30 int main(){
31     int data[] = {10, 8, 9, 7, 4, 5};
32     int length=sizeof(data)/sizeof(data[0]);
33     Search_max_and_min(data,length);
34 }

比较次数仍为1.5N,相当于a[2k]和a[2k+1]先进行了一次比较,确定了大小,然后分别和max,min比较,节约了0.5N次比较。

解法四:

采用分治的思想,在N个数中求max和min,分别求出前后N/2个数的max和min,然后取较小的min和较大的max。比较次数同样为1.5N。

时间: 2024-10-12 12:14:04

编程之美 2.10寻找数组中的最大最小值的相关文章

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

这个问题其实很容易解决,就是循环遍历一遍数组,然后找到数组中存在的最大值和最小值就可以了,书中主要讨论的问题是比较次数较小的方法,不过,书中已经证明了,无论用什么方法最少的比较次数也就是循环遍历一遍的比较,结果是O(1.5N)的,所以,很容易的可以解决这个问题. 第一种方法: 函数声明: void DutFindMaxAndMinInArray_1(int*, int, int&, int&); 源代码如下: /*基本的解法寻找最大值和最小值*/ bool _DutFindMaxAndMi

编程之美3:寻找数组中的最大值和最小值以及最大值和次大值

很开心,这是今天的第三篇文章啦!下午健身也感觉非常过瘾,托付宿舍妹子从日本代购的护肤品也到了.耳边漂浮着Hebe田馥甄的<魔鬼中的天使>文艺的声线,一切都好棒,O(∩_∩)O哈哈~.爱生活,爱音乐,爱运动,额,当然还有要爱学习啦!加油(^ω^) 额,扯远了.第三篇是关于寻找数组中的最大值和最小值.第一次看到这个题目的时候,楼主稍微鄙视了一下,因为觉得这个题目有什么好做的.但是楼主还是看了看<编程之美>上的写的,发现还是有必要记录一下,不一样的思考方式.很赞!大家和楼主一起哦,Are

寻找数组中最大值和最小值

题目来源:<编程之美>2.10 题目:同时找出数组中的最大数和最小数 分析:最基本的方法是两次线性扫描数组,分别找出最大数和最小数,时间复杂度为O(n).其实我们可以一次扫描即可.首先,我们将输入元素相互进行比较,然后把较小的与当前最小值比较,把较大的与当前最大值进行比较.这样,对每两个元素共需3次比较. 如何设定已知的最大值和最小值的初始值依赖于n是奇数还是偶数.如果n是奇数,我们就将最大值和最大值的初值都设定为第一个元素的值,然后成对地处理余下的元素.如果n是偶数,就将对前两个元素做一次比

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

解法一: 分别求出数组中的最大值和最小值.先扫描一遍数组,找出最大的数和最小的数.需要比较2*N次. 解法二: 一般情况下,最大值和最小值不相同.所以把数组分成两部分,然后再从这两部分中分别找出最大值和最小值. 最后,从奇偶数位上分别求出Max=9,Min=3,各需要比较N/2次,整个算法共需要比较1.5*N次. 解法三: 解法二破坏了数组,如果在遍历过程中进行比较,而不需要交换元素,就可以不破坏数组了.首先仍然按顺序将数组中相邻的两个数分在同一组(概念上的分组),然后利用两个变量Max,和Mi

2.10 用最少次数寻找数组中的最大值和最小值[find min max of array]

[本文链接] http://www.cnblogs.com/hellogiser/p/find-min-max-of-array.html [题目] 对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢? [分析] 1. 遍历两次数组,分别找出最大值和最小值,需要进行 2N 次比较. 2. 将数组中的元素分组,按顺序将数组中相邻的两个数分在同一组,用Max和Min来存储最大值和最小值.同一组比较完之后,较小的数与当前的最小值比较,如该数小于当前最小值,更新Min:较大的数与当

编程之美 2.10 扩展问题

编程之美 2.10 扩展问题 题目如下: 如果需要找出N个数组中的第二大数,需要比较多少次呢?是否可以使用过类似的分治思想来降低比较的次数呢? 解法一 我们最容易想到的方法就是:我们数组进行排序,取倒数第二个数即为所求.但是比较次数是很高的,不可取. 解法二 用2个中间变量来保存最大值和第二大的值,遍历一次数组即可得到最大值和第二大的值.比较次数为:2*N 实现代码如下: package com.wrh.firstpro; import java.util.Arrays; /* * 寻找数组中的

[经典算法题]寻找数组中第K大的数的方法总结

[经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26 字体:[大 中 小] 打印复制链接我要评论 今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值. 名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家. 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题.

寻找数组中的第K大的元素,多种解法以及分析

遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因为不要求别的信息只要计算出第K大的元素.当然,如果在某种情况下需要频繁访问第K大的元素就可以先进行一次排序在直接得出结果. 第一种方式是这样,用选择排序,冒泡法,或者交换排序这类的排序,对前K个元素进行排序.这三种算法也许不是最快的排序算法.但是都有个性质:计算出最大(小)的元素的算法复杂度是O(N

第2章 数字之魅——寻找数组中的最大值和最小值

寻找数组中的最大值和最小值 问题描述 对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢? 分析与解法 [解法一] 可以把寻找数组中的最大值和最小值看成是两个独立的问题,我们只要分别求出数组的最大值和最小值即可解决问题.最直接的做法是先扫描一遍数组,找出最大的数以及最小的数.这样,我们需要比较2*(N-1)次才能找出最大的数和最小的数.代码如下: 1 package chapter2shuzizhimei.findminmax; 2 /** 3 * 寻找数组中的最大值和最小