一般来说,min_max的做法是扫两遍,比较次数(2n)上下,
但是,下面的方法,不说话,上代码,请欣赏:
#include "cstdio.h"
int a[]={0,-9,1,2,-3,8,4,7,15,6};
void minmax(int l, int r, int& min, int & max)
{
int minl, minr, maxl, maxr;
if(l==r) min=max=a[l];
else if(l+1==r) {
if(a[l]<a[r]) min=a[l], max=a[r];
else min=a[r], max=a[l];
}
else {
int mid=(l+r)>>1;
minmax(l, mid, minl, maxl);
minmax(mid+1, r, minr, maxr);
min=minl<minr ? minl:minr;
max=maxl>maxr ? maxl:maxr;
}
}
void minmax(int n, int& min, int& max){
int i, mi, ma;
if(n%2) {
min=max=a[0];
i=1;
}
else {
if(a[0]<a[1]) min=a[0], max=a[1];
else min=a[1], max=a[0];
i=2;
}
while(i<n) {
if(a[i]<a[i+1]) mi=a[i], ma=a[i+1];
else mi=a[i+1], ma=a[i];
if(min>mi) min=mi;
if(max<ma) max=ma;
i+=2;
}
}
int main()
{
int min, max;
minmax(0, 9, min, max);
printf("min: %d max: %d\n", min, max);
minmax(10, min, max);
printf("min: %d max: %d\n", min, max);
return 0;
}