求数组最大最小值我们可以用遍历或者最简单的排序方法来实现,但是那样子的时间复杂度将会大很多,因此我们可以采用分治思想来求最大最小值,即先求左右两部分,即先求出左半部分的最大最小值,再求出右半部分的最大最小值,然后再把左右两部分的最大最小值合起来求总的最大最小值。
这个算法的时间复杂度T(n) = 2T(n/2) + O(1) 利用构造递归树可以求得总的时间为O(n)。
代码如下:
#include<iostream>
using namespace std;
/* author:chhuaj
date:2013.9.13
description:求数组的最大和最小值(采用递归法)
*/
void max_min(int *num,int l,int r,int &maxnum,int &minnum)
{
if(l==r) //数组只有一个元素
{
maxnum=num[l];
minnum=num[l];
return;
}
if(l+1==r) //数组有两个元素
{
if(num[l]>num[r])
{
maxnum=num[l];
minnum=num[r];
}
else
{
maxnum=num[r];
minnum=num[l];
}
return; //确定最大最小值之后必须返回,否则将进入死循环。
}
int m =(l+r)/2;
int lmax,lmin;
max_min(num,l,m,lmax,lmin); //递归求左半部分最大最小值
int rmax,rmin;
max_min(num,m,r,rmax,rmin); //递归求右半部分最大最小值
maxnum = max(lmax,rmax);
minnum = min(lmin,rmin); //总的最大最小值
}
int main()
{
int a[10]={0,9,1,6,3,4,8,2,7,5};
int maxnum,minnum;
max_min(a,0,9,maxnum,minnum);
cout<<maxnum<<","<<minnum<<endl;
return 0;
}