与此同时寻找一个数组中的最大元素和最小元素-你会有所收获

同时寻找一个数组中的最大元素和最小元素--你会有所收获

给定一个数组a,含有n,寻找这个数组中的最大元素和最小元素,刚看到这个题目的时候,觉得这个问题没什么思考性,因为这个问题很简单,就是设定一个初始最大值和初始最小值,然后循环遍历数组,进行比较,至多会在2(n-1)的时间内找到最大值和最小值。下面给出一种分析的方法,使得这个问题能够在3*(n/2)内结束。首先要判定n是奇数还是偶数,

如果是奇数的话,假设min=max=a[1].然后遍历数组,但是这时候每次取两个数字,并把这两个数字进行比较,将较大的值和max进行比较,较小的值和min进行比较。这样循环 会在(n-1)/2或者(n-2)/2次后结束,这样比较的次数就变为每次循环要比较三次。这个方法对于n值很小的数组来说,没什么太大的影响,但是如果数组的n值很大的话,那时间减少了相当于原来的四分之一。下面给出代码和事例:

#include<stdio.h>
void find_min_max(int a[],int n,int *min,int *max)
{
	int i;
	if(n%2==1)
	{
		*min=a[0];
		*max=a[0];
		i=1;
	}
	else
	{
		if(a[0]>a[1])
		{
			*max=a[0];
			*min=a[1];
		}
		else
		{
			*max=a[1];
			*min=a[0];
		}
		i=2;
	}
	for(;i<n;i+=2)
	{
		if(a[i]>a[i+1])
		{
			if(a[i]>(*max))
				*max=a[i];
			if(a[i+1]<(*min))
				*min=a[i+1];
		}
		else
		{
			if(a[i+1]>(*max))
				*max=a[i+1];
			if(a[i]<(*min))
				*min=a[i];
		}
	}
}
void main()
{
	int a[]={1,9,6,4,5,22,13,56,45};
	int min,max;
	find_min_max(a,sizeof(a)/sizeof(int),&min,&max);
	printf("%d\t%d\n",min,max);
}