В этом решении используется парадигма Divide and Conquer
.
Я основал этот ответ от этого веб-сайта , и там вы можете увидеть объяснение, почему для этого потребуется (3n / 2) - 2
сравнение.
Чтобы понять, как это работает, я предлагаю взять ручку и бумагу и следовать коду, используя меньший ввод (например: {3,2,1,0}).
#include <iostream>
using namespace std;
int* maxMin(int* values, int begin, int end) {
int partialSmallest, partialLargest;
int mid, max1, min1, max2, min2;
//Here we store Largest/Smallest
int* result = new int[2];
//When there's only one element
if (begin == end) {
partialSmallest = values[begin];
partialLargest = values[begin];
}
else {
//There is not only one element, therefore
//We will split into two parts, and call the function recursively
mid = (begin + end) / 2;
// Solve both "sides"
int* result1 = maxMin(values, begin, mid);
int* result2 = maxMin(values, mid+1, end);
max1 = result1[0];
min1 = result1[1];
max2 = result2[0];
min2 = result2[1];
//Combine the solutions.
if (max1 < max2)
partialLargest = max2;
else
partialLargest = max1;
if (min1 < min2)
partialSmallest = min1;
else
partialSmallest = min2;
}
result[0] = partialLargest;
result[1] = partialSmallest;
return result;
}
int main(){
int values[10] = {9,8,7,6,5,4,3,2,1,0};
int* finalResult = maxMin(values, 0, 9);
cout << "Largest: " << finalResult[0] << " Smallest: " << finalResult[1];
}