最大数和最小数

转载请注明出处:http://blog.csdn.net/ns_code/article/details/28735533


求一个数组中的最大值和最小值,我们一般的做法是扫描一遍数组求的最大值,扫描一遍数组求最小值,这样做需要比较2N次才能求解。而实际上我们可以比较1.5N次即可得到结果。考虑如下几种方法。

方法一:

我们可以把数组分成两部分,首先按照顺序将数组中的相邻的两个数分在同一组,接着比较同一组中奇数位上的值和偶数位上的值,将较大的放在偶数位上,较小的放在奇数位上,这样经过0.5N次比较后,最大数肯定在偶数位上,最小的数肯定在奇数位上,而后分别扫描一遍数组的偶数位和奇数位,便可得到最大值和最小值。这样,真个算法只需比较1.5N次。代码很简单,不再给出。

方法二:

方法一会破坏原数组的结构,要避免这个问题,我们给出方法二。首先仍按照顺序将相邻的两个元素划为一组,而后利用两个变量max和min保存当前的最大值和最小值,同一组的数比较之后,不再交换位置,而是将其中较小的数与min作比较,如果小于min则更新min,同理将其中较大的数与max作比较,如果大于max则更新max。这样依然共有0.5N组,每一组的两个元素比较,要比较0.5N次,max与该组较大者比较,共比较0.5N次,min与该组最小者比较,共比较0.5N次,一共也是1.5N次。代码同样很简单,不再给出。

方法三:

可以用分治的思想,只需分别求出数组前后N/2个数中的最大值和最小值,而后取两个大值中最大值最为max,去两个小值中的最小值为min,该方法同样要比较N/2次。实现代码如下:

/*
分治法求最大最小值
*/
void SearchMaxAndMin(int *arr,int start,int end,int *min,int *max)
{
	if(arr == NULL)
		return;
	if(end-start <=1)
	{
		if(arr[start]>arr[end])
		{
			*max = arr[start];
			*min = arr[end];
		}
		else
		{
			*max = arr[end];
			*min = arr[start];
		}
		return;
	}

	int maxL,minL;
	int maxR,minR;
	SearchMaxAndMin(arr,start,(start+end)>>1,&minL,&maxL);    //求左边最大最小值
	SearchMaxAndMin(arr,((start+end)>>1)+1,end,&minR,&maxR);  //求右边最大最小值

	if(maxL>maxR)
		*max = maxL;
	else
		*max = maxR;
	if(minL<minR)
		*min = minL;
	else
		*min = minR;
}

    延伸

求数组中的第二大的数,如果我们先扫描一遍数组,求的最大值,而后将其放到数组的最后,再求剩下元素的最大值,这样依然要比较2N-1次。

我们可以通过设置两个变量max1和max2分别保存最大值和次大值,将数组的前两个值中大的赋给max1,小的赋给max2,遇到某个元素大于max1,则更新max1,如果某元素大于max2,小于max1,则更新max2,这样到最后遍历一遍便可以得出次大值,但这样因为每个元素要与两个值比较,因此比较次数依然为2N。

同样可以利用解法二类似的方法,将比较次数降到1.5N次,将min改为max2,改变max2的更新条件即可。

依然也可以用分治的策略,比较前后N/2个数中的最大值和次大值,二者均取最大的那个,这样比较次数依然为1.5N.

而要求数组中的第k大的数,可以参考我的这篇博文:http://blog.csdn.net/ns_code/article/details/26966159

最大数和最小数

时间: 2024-10-16 01:26:47

最大数和最小数的相关文章

编程题:全局的使用。求最大数、最小数和平均值。

#include<stdio.h> int Num,Max,Min; int average(int array[]) { int i,array_aver=array[0]; Max=Min=array[0]; for(i=1;i<Num;i++) { if(array[i]>Max) Max=array[i]; if(array[i]<Min) Min=array[i]; array_aver+=array[i];} array_aver/=Num; return arr

同时寻找最大数和最小数的最优算法以及寻找最大的两个数所需的最少比较次数

我们知道,在一个容量为n的数据集合中寻找一个最大数,不管用什么样的比较算法,至少要比较n-1次,就算是用竞标赛排序也得比较n-1次,否则你找到的就不能保证是最大的数.那么,在一个容量为n的数据集合中同时寻找最大数和最小数的最小比较次数是多少呢? 从一个容量为n的数据集合中同时找到最大数和最小数的最优方法是:首先让所有的元素参与两两比较,这样总共比较了n/2次,最大数肯定在胜者组中,最小数肯定在败者组中:然后从容量为n/2的胜者组中找到最大的数,最少要比较n/2 - 1次:同理,从容量为n/2的败

Max-Min-搜索int类型数字文件中的最大数和最小数写到屏幕

Max-Min-搜索int类型数字文件中的最大数和最小数写到屏幕: //Max-Min-搜索int类型数字文件中的最大数和最小数写到屏幕 #include<iostream> #include<fstream> #include<cstdlib> int main() { using namespace std; ifstream fin; ofstream fout; int max,min,tem; fin.open("numbers.dat")

C#数组求和,求最大数,最小数,平均值

以上是代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { int[] arr = new int[10]; int count = 0; for (i

【c语言】利用指针求三个数的最大数和最小数

比较费空间的笨方法: #include<stdio.h>void main(){    int i,j,k,*m,*n,*q,temp;    printf("请输入三个数:");    scanf("%d,%d,%d",&i,&j,&k);    printf("三个数是:%d,%d,%d\n",i,j,k);    m=&i,n=&j,q=&k;    if(*n<*m){  

最大数,最小数

public class ZDSH { public static void main(String[] args) { int[] a = new int[] { 10, 77, 45, 34, 56 }; int b = 0; for (int i = 0; i < a.length; i++) { if (a[i] > b) //System.out.println(i); b = a[i]; } System.out.println(b); for(int i = 0;i < a

同时找出最大数和最小数

1 #include<iostream> 2 #include<ctime> 3 using namespace std; 4 5 int Min(int a, int b) 6 { 7 if (a < b) 8 return a; 9 else 10 return b; 11 } 12 13 int Max(int a, int b) 14 { 15 if (a > b) 16 return a; 17 else return b; 18 } 19 20 void M

求最大数,最小数

package my;public class MyJava {        public static void main(String[] args) {        // TODO Auto-generated method stub        int[] num = {10,5,13,22,87,44};        int max = num[0];        int min = num[0];        for (int i = 1; i < num.length;

已知从BUF开始存放了10个字类型有符号数据,编程求出这10个数中的最大数和最小数(将最大数存入MAX字单元、最小数存入MIN字单元),并将其以10进制数的形式在屏幕上显示出来。

data segment pmax db 0dh,0ah , 'MAX : ','$' pmin db 0dh,0ah , 'MIN : ','$' buf dw 48,-2 ,49,50,30,-78,-88,-60,-1,48 max dw 99 min dw 20 data ends code segment assume cs:code , ds:data main proc far start: mov ax,data mov ds,ax call compare lea dx,pma