1. 程式人生 > >遞迴求陣列最大最小值(分治思想)

遞迴求陣列最大最小值(分治思想)

求陣列最大最小值我們可以用遍歷或者最簡單的排序方法來實現,但是那樣子的時間複雜度將會大很多,因此我們可以採用分治思想來求最大最小值,即先求左右兩部分,即先求出左半部分的最大最小值,再求出右半部分的最大最小值,然後再把左右兩部分的最大最小值合起來求總的最大最小值。

程式碼如下:

#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;
}