//思路来自编程之美上,留个纪念吧
//比较次数:1.5N -2
//思路:先求左边部分,再求右边部分的最大值和最小值、
//
#include <iostream>
using namespace std;
typedef struct Value_
{
int max, min;
}Value;
Value getMaxMin(int arr[], int left, int right)
{
if (right - left <= 1)
{
Value v;
v.max = max(arr[left], arr[right]);
v.min = min(arr[left], arr[right]);
return v;
}
Value leftValue, rightValue;
int mid = left + (right - left) / 2;
leftValue = getMaxMin(arr, left, mid);
rightValue = getMaxMin(arr, mid + 1, right);
leftValue.max = max(leftValue.max, rightValue.max);
leftValue.min = min(leftValue.min, rightValue.min);
return leftValue;
}
int main()
{
int arr[] = {1, 2, 4, 5, 6};
int n = sizeof(arr) / sizeof(arr[0]);
Value v = getMaxMin(arr, 0, n - 1);
printf("%d %d\n", v.max, v.min);
return 0;
}