用递归法求一个给定的数组中的最大值和最小值。
我们来分析:
分治法,类似二分查找,可以先求解出左半部分的最大值和最小值,再求解出右半部分的最大值和最小值然后合并求解,就可以求解出整个数组中的最大值和最小值。
那么递归的出口条件是什么呢?当划分以后,划分出的区间里只有一个元素的情况下,这个元素既是这个子数组的最大值也是子数组中的最小值,这时候就是递归的出口。下面就让代码开口说话吧。
#include "iostream"
using namespace std;
void MaxAndMin(int array[], int left, int right, int* max, int* min)
{
if (left == right)
{
*max = array[left];
*min = array[left];
return;
}
else
{
int leftMax;
int leftMin;
int rightMax;
int rightMin;
int middle = (left + right)/2;
MaxAndMin(array, left, middle, &leftMax, &leftMin);
MaxAndMin(array, middle+1, right, &rightMax, &rightMin);
*max = (leftMax > rightMax ? leftMax : rightMax);
*min = leftMin < rightMin ? leftMin : rightMin;
return;
}
}
void main(){
int array[10] = {-1, 9, 78, 54, -48, 2, 4, 198, 0, 9};
int max = 0;
int min = 0;
MaxAndMin(array, 0, 9, &max, &min);
cout << "max=" << max << " min=" << min << endl;
}