#include <iostream>
using namespace std;
class Comparator {
public:
bool operator()(int a, int b) {
count++;
return (a < b) ? true : false;
}
static int count;
};
int Comparator::count = 0;
template<class T> void MaxMin(T* A, T&max, T&min, int size, Comparator &c) {
// check size odd or even
T _min, _max, i;
if (size/2== 0) {
if (c(A[0], A[1])) {
_min = A[0];
_max = A[1];
} else {
_min = A[1];
_max = A[0];
}
i = 2;
} else {
_min = A[0];
_max = A[0];
i = 1;
}
for (; i <= size - 2; i+=2) {
if (c(A[i], A[i+1])) {
if (c(A[i], _min)) {
_min = A[i];
}
if (c(_max, A[i+1])) {
_max = A[i+1];
}
}else{
if (c(A[i+1], _min)) {
_min = A[i+1];
}
if (c(_max, A[i])) {
_max = A[i];
}
}
}
min = _min;
max = _max;
}
int main() {
int A[] = { 2, 5, 3, 0, 2, 3, 0, 3 };
int size = sizeof(A)/sizeof(int);
int min = 0;
int max = 0;
Comparator c;
MaxMin(A, max, min, size, c);
cout << "max is " << max << ", min is " << min << endl;
cout << "size is " << size << ", compare count is " << Comparator::count << endl;
}
max is 5, min is 0
size is 8, compare count is 9