例:用递归求数组上的最大值和最小值。
将数组分成左右两个部分,分别求出左右两边的最大值和最小值,再比较即可。画出如下递归树:
#include <iostream>
void maxAndmin(int a[], int l, int r, int &max, int &min)
{
if (l == r)
{
max = min = a[l];
return;
}
if (r - 1 == l)
{
max = a[i] > a[j] ? a[i] : a[j];
min = a[i] < a[j] ? a[i] : a[j];
return;
}
int mid, max1, max2, min1, min2;
//mid = (l + r) / 2; 可能会溢出
//mid=l+(r-l)/2; 不会溢出 num/2 == num>>1
//右移等于除以2 左移等于乘
mid = l + (r - l) >> 1;
maxAndmin(a, l, mid, max1, min1);
maxAndmin(a, mid + 1, r, max2, min2);
max = max1 > max2 ? max1 : max2;
min = min1 < min2 ? min1 : min2;
}
int main()
{
int a[] = { 5,6,4,2,9,8,7,3,1 };
int i = 0, j = 8;
int max ,min ;
maxAndmin(a, i, j, max, min);
std::cout << max << " " << min;
}
利用master公式求时间复杂度
T(N)=a*T(N/b)+O(N^d)
- log(b,a)>d 复杂度为 O(N^log(b,a))
- log(b,a)=d 复杂度为 O(N^d *logN)
- log(b,a)<d 复杂度为O(N^d)