#include <bits/stdc++.h>
using namespace std;
// global variable to count total number of comparisons
int comparisons = 0;
// Divide & Conquer solution to find minimum and maximum number in an array
void findMinAndMax(int arr[], int low, int high, int& min, int& max)
{
// if array contains only one element
comparisons += 1;
if (low == high) // common comparison
{
if (max < arr[low]) // comparison 1
max = arr[low];
if (min > arr[high]) // comparison 2
min = arr[high];
comparisons += 2;
return;
}
// if array contains only two elements
comparisons += 1;
if (high - low == 1) // common comparison
{
if (arr[low] < arr[high]) // comparison 1
{
if (min > arr[low]) // comparison 2
min = arr[low];
if (max < arr[high]) // comparison 3
max = arr[high];
}
else
{
if (min > arr[high]) // comparison 2
min = arr[high];
if (max < arr[low]) // comparison 3
max = arr[low];
}
comparisons += 3;
return;
}
// find mid element
int mid = (low + high) / 2;
// recuse for left subarray
findMinAndMax(arr, low, mid, min, max);
// recuse for right subarray
findMinAndMax(arr, mid + 1, high, min, max);
}
int main()
{
// int arr[] = { 7, 2, 9, 3, 1, 6, 7, 8, 4};
int arr[] = { 7, 2, 9, 3, 1, 6, 7, 8, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
// initialize minimum element by infinity
// initialize maximum element by minus infinity
int max = INT_MIN, min = INT_MAX;
findMinAndMax(arr, 0, n - 1, min, max);
cout << "The minimum element in the array is " << min << endl;
cout << "The maximum element in the array is " << max << endl;
cout << "\nTotal number of comparisons is " << comparisons;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBnbG9iYWwgdmFyaWFibGUgdG8gY291bnQgdG90YWwgbnVtYmVyIG9mIGNvbXBhcmlzb25zCmludCBjb21wYXJpc29ucyA9IDA7CgovLyBEaXZpZGUgJiBDb25xdWVyIHNvbHV0aW9uIHRvIGZpbmQgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgaW4gYW4gYXJyYXkKdm9pZCBmaW5kTWluQW5kTWF4KGludCBhcnJbXSwgaW50IGxvdywgaW50IGhpZ2gsIGludCYgbWluLCBpbnQmIG1heCkKewoJLy8gaWYgYXJyYXkgY29udGFpbnMgb25seSBvbmUgZWxlbWVudAoJY29tcGFyaXNvbnMgKz0gMTsKCWlmIChsb3cgPT0gaGlnaCkJCQkvLyBjb21tb24gY29tcGFyaXNvbgoJewoJCWlmIChtYXggPCBhcnJbbG93XSkJCS8vIGNvbXBhcmlzb24gMQoJCQltYXggPSBhcnJbbG93XTsKCgkJaWYgKG1pbiA+IGFycltoaWdoXSkJLy8gY29tcGFyaXNvbiAyCgkJCW1pbiA9IGFycltoaWdoXTsKCQkKCQljb21wYXJpc29ucyArPSAyOwoJCXJldHVybjsKCX0KCgkvLyBpZiBhcnJheSBjb250YWlucyBvbmx5IHR3byBlbGVtZW50cwoJY29tcGFyaXNvbnMgKz0gMTsKCWlmIChoaWdoIC0gbG93ID09IDEpCQkJLy8gY29tbW9uIGNvbXBhcmlzb24gCgl7CgkJaWYgKGFycltsb3ddIDwgYXJyW2hpZ2hdKQkvLyBjb21wYXJpc29uIDEKCQl7CgkJCWlmIChtaW4gPiBhcnJbbG93XSkJCS8vIGNvbXBhcmlzb24gMgoJCQkJbWluID0gYXJyW2xvd107CgoJCQlpZiAobWF4IDwgYXJyW2hpZ2hdKQkvLyBjb21wYXJpc29uIDMKCQkJCW1heCA9IGFycltoaWdoXTsKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKG1pbiA+IGFycltoaWdoXSkJLy8gY29tcGFyaXNvbiAyCgkJCQltaW4gPSBhcnJbaGlnaF07CgkJCQoJCQlpZiAobWF4IDwgYXJyW2xvd10pCQkvLyBjb21wYXJpc29uIDMKCQkJCW1heCA9IGFycltsb3ddOwoJCX0KCQljb21wYXJpc29ucyArPSAzOwoJCXJldHVybjsKCX0KCgkvLyBmaW5kIG1pZCBlbGVtZW50CglpbnQgbWlkID0gKGxvdyArIGhpZ2gpIC8gMjsKCQoJLy8gcmVjdXNlIGZvciBsZWZ0IHN1YmFycmF5CglmaW5kTWluQW5kTWF4KGFyciwgbG93LCBtaWQsIG1pbiwgbWF4KTsKCQoJLy8gcmVjdXNlIGZvciByaWdodCBzdWJhcnJheQoJZmluZE1pbkFuZE1heChhcnIsIG1pZCArIDEsIGhpZ2gsIG1pbiwgbWF4KTsKfQoKaW50IG1haW4oKQp7CgkvLyBpbnQgYXJyW10gPSB7IDcsIDIsIDksIDMsIDEsIDYsIDcsIDgsIDR9OwoJaW50IGFycltdID0geyA3LCAyLCA5LCAzLCAxLCA2LCA3LCA4LCA0LCA1fTsKCglpbnQgbiA9IHNpemVvZihhcnIpIC8gc2l6ZW9mKGFyclswXSk7CgoJLy8gaW5pdGlhbGl6ZSBtaW5pbXVtIGVsZW1lbnQgYnkgaW5maW5pdHkKCS8vIGluaXRpYWxpemUgbWF4aW11bSBlbGVtZW50IGJ5IG1pbnVzIGluZmluaXR5CQoJaW50IG1heCA9IElOVF9NSU4sIG1pbiA9IElOVF9NQVg7CgoJZmluZE1pbkFuZE1heChhcnIsIDAsIG4gLSAxLCBtaW4sIG1heCk7CgoJY291dCA8PCAiVGhlIG1pbmltdW0gZWxlbWVudCBpbiB0aGUgYXJyYXkgaXMgIiA8PCBtaW4gPDwgZW5kbDsKCWNvdXQgPDwgIlRoZSBtYXhpbXVtIGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzICIgPDwgbWF4IDw8IGVuZGw7CgkKCWNvdXQgPDwgIlxuVG90YWwgbnVtYmVyIG9mIGNvbXBhcmlzb25zIGlzICIgPDwgY29tcGFyaXNvbnM7CglyZXR1cm4gMDsKfQo=