码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-05-22 17:04:23      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:class   blog   c   code   a   int   

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

一般的做法:

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);
}


 

求数组元素的最大值最小值,布布扣,bubuko.com

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

标签:class   blog   c   code   a   int   

原文地址:http://blog.csdn.net/sawydky/article/details/26513035

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!