求数组最大最小值我们可以用遍历或者最简单的排序方法来实现,但是那样子的时间复杂度将会大很多,因此我们可以采用分治思想来求最大最小值,即先求左右两部分,即先求出左半部分的最大最小值,再求出右半部分的最大最小值,然后再把左右两部分的最大最小值合起来求总的最大最小值。
这个算法的时间复杂度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;
}

本文介绍了一种使用分治法高效求解数组中最大值和最小值的方法。通过递归地将数组分为两部分并分别求解,最终合并结果得到整个数组的最大最小值。该算法的时间复杂度为O(n),相较于直接排序或遍历有显著优势。
&spm=1001.2101.3001.5002&articleId=39668225&d=1&t=3&u=c518b0b30461425ab8813e4fbf9beaa1)
1438

被折叠的 条评论
为什么被折叠?



