首页 > 代码库 > 求数组元素的最大值最小值

求数组元素的最大值最小值

这是编程之美上的一个题目:

一般的做法:

void main(){	int a[5]={78,63,78,67,18};	int min=0,max=0;	min=max=a[0];	for(int i=0;i<5;i++)	{		if(min>a[i])			min=a[i];		if(max<a[i])			max=a[i];	}               printf("%d,%d\n",max,min);}

这种方法总共比较了2*N次

如何降低比较次数呢?

我在这里着重记录一下分冶法的做法:

分冶法着重于分->合的过程,主要用递归的方法。

在本题目中,可以先将该数组分为0-N/2和N/2+1-N两个部分,在这两个部分中分别找出最大值和最小值,然后通过比较两个最大值和两个最小值,找出最大值最小值。

那么如何找到0-N/2的最大值和最小值呢?继续将该部分分为两部分,在这两个部分中分别找出最大值和最小值,然后通过比较两个最大值和两个最小值,找出最大值最小值。

那么你应该知道了吧、、、(可以看一下我的博文、、归并排序)

详细代码:

#include <stdio.h>void search(int *a,int front,int end,int *min,int *max){    int left_min,left_max,right_min,right_max;	if(end-front<=1)	{		if(a[front]>a[end])		{			*min=a[end];			*max=a[front];		}		else		{           	*min=a[front];			*max=a[end];		}		return;	}   	search(a,front,(front+end)/2,&left_min,&left_max);	search(a,(front+end)/2+1,end,&right_min,&right_max);	*min=left_min>right_min?right_min:left_min;	*max=left_max>right_max?left_max:right_max;}void main(){	int a[9]={20,30,41,23,25,34,56,42,30};	int min=0,max=0;         search(a,0,8,&min,&max);         printf("%d,%d",max,min);}