这是编程之美上的一个题目:
一般的做法:
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); }
原文地址:http://blog.csdn.net/sawydky/article/details/26513035