给定N个数,求取其最大最小值,要求尽可能的快

对于N个数的话,按照常规思路需要比较N-1次,然而T(2)=1,所以这里可以使用分治递归的方法
1. 将N个数等分为左边部分和右边部分 left right middle = (left + right)/2   [left midle] 与[left+1 right]
2. 分别求取左边最大,最小值和右边最大最小值
3. 合并左右最大值和左右最小值

代码
//算法
void  minmax( int  *  a ,  int   l int   r int  &  min   int  max )
{
                  int  minl, minr, maxl, maxr;
                  if  ( r  ==  l ) {  max  =  min  =  a [1]; }
                  else   if  (  r  ==  l  + 1) {
                                  if  ( a  [  l ] >  a  [ r  ]){
                                                  min   a  [  r ];  max  =  a [  l ];
                                }
                                  else  {
                                                  min   a  [  l ];  max  =  a [  r ];
                                }
                }
                  else  {
                                  int  m = ( l  r ) / 2;
                                minmax(  a   l  , m, minl,maxl);
                                minmax(  a  , m+1,  r  , minr, maxr);
                                  max  = maxl > maxr ? maxl : maxr;
                                  min  = minl < minr ? minl : minr;
                }
}
//测试
int  main()
{
                  int  a[9] = {9,4,5,3,7,8,2,1,6};
                  int  min, max;
                minmax(a, 0, 8, min, max);
                cout << min << endl;
                cout << max << endl;

                cin.ignore(1);
                  return  0;
}

你可能感兴趣的:(给定N个数,求取其最大最小值,要求尽可能的快)