typedef struct{
unsigned int min;
unsigned int max;
}MINMAX;
static size_t cmp; // number of compares (optional global)
MINMAX findminmax(int a[], size_t sizea)
{
MINMAX minmax;
MINMAX minmaxl;
MINMAX minmaxr;
size_t sizea2;
if(sizea == 0){ // if empty array (can only happen on initial call)
minmax.min = 0; // set min = max = 0
minmax.max = 0;
return minmax;
}
if(sizea == 1){ // if size == 1
minmax.min = a[0]; // set min = max = a[0]
minmax.max = a[0];
return minmax;
}
if(sizea == 2){ // if size == 2
if(a[0] <= a[1]){ // set min and max
minmax.min = a[0];
minmax.max = a[1];
} else {
minmax.min = a[1];
minmax.max = a[0];
}
cmp += 1;
return minmax;
}
sizea2 = sizea/2; // recursively split array, set min and max
minmaxl = findminmax(&a[0], sizea2);
minmaxr = findminmax(&a[sizea2], sizea - sizea2);
minmax.min = minmaxl.min <= minmaxr.min ? minmaxl.min : minmaxr.min;
minmax.max = minmaxl.max >= minmaxr.max ? minmaxl.max : minmaxr.max;
cmp += 2;
return minmax;
}