关闭

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

标签: C语言最大 最小
354人阅读 评论(0) 收藏 举报
分类:

问题:对于一个由N个整数组成的数组,需要比较多少次才能把最大值和最小值的数找出来呢?

原文链接:http://blog.csdn.net/xiaoding133/article/details/8043369

 解法一:将寻找数组中的最大值和最小值看成是两个独立的问题。分别求出最大值和最小值即可。这样需要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;
}
<span style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">该算法的时间复杂度为O(N)。</span>

0
0
查看评论

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

最简单的方法就是N中的每个数分别和max,min比较,看似2N次比较,其实大于max的就不必和min比较,小于min的也不必和max比较,因此比较的次数不足2N次,程序如下: bool MaxMin(std::vector array, T* max, T* min) { if (array....
  • bertzhang
  • bertzhang
  • 2012-02-13 19:36
  • 8551

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

问题:对于一个由N个整数组成的数组,需要比较多少次才能把最大值和最小值的数找出来呢?                 解法一:将寻找数组中的最大值和最小值看成是两个独立的问题。分别求出最大值和最小值即可...
  • xiaoding133
  • xiaoding133
  • 2012-10-06 16:16
  • 3878

试着用最小的比较次数去寻找数组中的最大值和最小值。

每次比较相邻两个数,较大者与MAX比较,较小者与MIN比较,找出最大值和最小值。 方法如下:先将一对元素互相进行比较,然后把最小值跟当前最小值进行比较,把最大值跟当前最大值进行比较。因此每两个元素需要3次比较。如果n为奇数,那么比较的次数是3*(n/2)次比较。如果n为偶数,那么比较的次数是3n/...
  • martin_liang
  • martin_liang
  • 2014-08-19 17:20
  • 1121

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

编程之美——寻找数组中的最大值和最小值 问题描述:给出一个数组,包含N个整数,那么需要比较多少次找到最大值和最小值 注意:要想得到最大值和最小值,遍历一遍数组是不可避免的。我们能减少的就是减少比较次数来提高效率 方法一、遍历一遍数组,同时得到最大值和最小值 具体是,定...
  • chenglinhust
  • chenglinhust
  • 2012-12-08 11:29
  • 3213

求数组中的最大值和最小值

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

如何寻找数组中的最大值和最小值

以下五种解法可以寻找到数组中的最大值和最小值; 1)问题分解法。     把本题看做两个独立的问题,而非一个问题,所以,每次分别找出最小值和最大值即可,此时,一共需要遍历两次数组,比较次数为2N次;(N表示数组的长度)  2)取单元素法。   ...
  • JohnLee_chun
  • JohnLee_chun
  • 2016-09-14 22:27
  • 5699

用汇编语言求一组数的最大值和最小值

首先对10个数按从小到大排序,然后第一个元素就是最小的,最后一个元素就是最大的 data segment mes1 db 'the max:$' mes2 db 'the min:$' a dw 42,20,100,456,99,120,89,12334,90...
  • xiongyaoqiongyao
  • xiongyaoqiongyao
  • 2012-12-05 20:57
  • 3172

js同时寻找数组中最大值和最小值,编程之美解法三

var arr = [1, 2, 34, 5, 43, 23, 54]; console.log(findMax(arr)); function findMax(arr) { var max, min, temp1, temp2, result = []; ...
  • ytf20140511
  • ytf20140511
  • 2016-09-16 18:54
  • 910

较快速在一个数组中查找最大值和最小值

#include #define MAX 100001 int a[MAX]; int n; /* 时间复杂度为3*n/2 */ void swap(int i) { if(i==n-1) return ; if(a[i]>a[i+1]) { int temp=a[i]; ...
  • yiranyaoqiu
  • yiranyaoqiu
  • 2013-10-13 09:51
  • 1198

JAVA得到数组中最大值和最小值的简单实例

该程序输出结果: 数组A的元素包括:74 48 30 17 62 数组的最大值是:74 数组的最小值是:17 程序说明如下: 1.第6行声明整数变量i 做为循环控制变量及数组的索引:另外也声明存放最小值的变量min与最大值的变量max。 2.第7行声明整型数组A,其数组元素有5个,其值分别为7...
  • zhangtongyuan0909
  • zhangtongyuan0909
  • 2017-04-12 14:19
  • 16534
    个人资料
    • 访问:101639次
    • 积分:1939
    • 等级:
    • 排名:千里之外
    • 原创:93篇
    • 转载:43篇
    • 译文:0篇
    • 评论:8条
    最新评论