Use the median-of-three algorithm:
int min (int a, int b) { return a<b?a:b; }
int max (int a, int b) { return a<b?b:a; }
int median_of_three (int a, int b, int c) { return max (min (a,
b), min (max (a, b), c)); }
Note that the algorithm does not cater for equal values which
creates a problem when any two values are equal, because there are
only two values to play with, neither of which can be regarded as
being the middle value. If the equal value is the lower of the two
values, the largest value is returned if and only if it is the last
of the three values, otherwise the lowest value is returned. But
when the equal value is the larger of the two values, the largest
value is always returned.
Lowest value is equal:
Input: 0, 0, 1 = max (min (0, 0), min (max (0, 0), 1)) = max (0,
min (0, 1)) = max (0, 1) = 1
Input: 0, 1, 0 = max (min (0, 1), min (max (0, 1), 0)) = max (0,
min (1, 0)) = max (0, 0) = 0
Input: 1, 0, 0 = max (min (1, 0), min (max (1, 0), 0)) = max (0,
min (1, 0)) = max (0, 0) = 0
Highest value is equal:
Input: 0, 1, 1 = max (min (0, 1), min (max (0, 1), 1)) = max (0,
min (1, 1)) = max (0, 1) = 1
Input: 1, 0, 1 = max (min (1, 0), min (max (1, 0), 1)) = max (0,
min (1, 1)) = max (0, 1) = 1
Input: 1, 1, 0 = max (min (1, 1), min (max (1, 1), 0)) = max (1,
min (1, 0)) = max (1, 0) = 1
The only way to resolve this problem and produce a consistent
result is to sum all three inputs then subtract the minimum and
maximum values:
int median_of_three (int a, int b, int c) { return a + b + c -
min (min (a, b), c) - max (max (a, b), c)); }
Lowest value is equal:
Input: 0, 0, 1 = 0 + 0 + 1 - min (min (0, 0), 1) - max (max (0,
0), 1) = 1 - 0 - 1 = 0
Input: 0, 1, 0 = 0 + 1 + 0 - min (min (0, 1), 0) - max (max (0,
1), 0) = 1 - 0 - 1 = 0
Input: 1, 0, 0 = 1 + 0 + 0 - min (min (1, 0), 0) - max (max (1,
0), 0) = 1 - 0 - 1 = 0
Highest value is equal:
Input: 0, 1, 1 = 0 + 1 + 1 - min (min (0, 1), 1) - max (max (0,
1), 1) = 2 - 0 - 1 = 1
Input: 1, 0, 1 = 1 + 0 + 1 - min (min (1, 0), 1) - max (max (1,
0), 1) = 2 - 0 - 1 = 1
Input: 1, 1, 0 = 1 + 1 + 0 - min (min (1, 1), 0) - max (max (1,
1), 0) = 2 - 0 - 1 = 1
This makes sense because when we sort 0, 0, 1 in ascending
order, 0 is in the middle, while 0, 1, 1 puts 1 in the middle.