首页 > 代码库 > 求数组元素的最大值最小值
求数组元素的最大值最小值
这是编程之美上的一个题目:
一般的做法:
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);}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。