Middle of three using minimum comparisons

07 Jul, 2022
Given three distinct numbers a, b and c find the number with a value in middle.
Examples:
Input : a = 20, b = 30, c = 40
Output : 30

Input : a = 12, n = 32, c = 11
Output : 12
Simple Approach:
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find  middle of three distinct// numbers#include <bits/stdc++.h>using namespace std; int middleOfThree(int a, int b, int c){    // Checking for b    if ((a < b && b < c) || (c < b && b < a))       return b;     // Checking for a    else if ((b < a && a < c) || (c < a && a < b))       return a;     else       return c;} // Driver Codeint main(){    int a = 20, b = 30, c = 40;    cout << middleOfThree(a, b, c);    return 0;}
// Java program to find middle of// three distinct numbersimport java.util.*; class Middle{      // Function to find the middle of three number    public static int middleOfThree(int a, int b,                                          int c)    {        // Checking for b        if ((a < b && b < c) || (c < b && b < a))            return b;         // Checking for a        else if ((b < a && a < c) || (c < a && a < b))        return a;         else        return c;    }         // driver code    public static void main(String[] args)    {        int a = 20, b = 30, c = 40;        System.out.println( middleOfThree(a, b, c) );    }} // This code is contributed by rishabh_jain
# Python3 program to find middle# of three distinct numbers def middleOfThree(a, b, c):         # Checking for b    if ((a < b and b < c) or (c < b and b < a)) :        return b;     # Checking for a    if ((b < a and a < c) or (c < a and a < b)) :        return a;     else :        return c # Driver Codea = 20b = 30c = 40print(middleOfThree(a, b, c)) # This code is contributed by rishabh_jain
// C# program to find middle of// three distinct numbersusing System; class Middle{    // Function to find the middle of three number    public static int middleOfThree(int a, int b,                                        int c)    {        // Checking for b        if ((a < b && b < c) || (c < b && b < a))            return b;         // Checking for a        else if ((b < a && a < c) || (c < a && a < b))        return a;         else        return c;    }         // Driver code    public static void Main()    {        int a = 20, b = 30, c = 40;        Console.WriteLine( middleOfThree(a, b, c) );    }} // This code is contributed by vt_m
<?php// PHP program to find middle// of three distinct numbers function middleOfThree($a, $b, $c){         // Checking for b    if (($a < $b && $b < $c) or        ($c < $b && $b < $a))    return $b;     // Checking for a    else if (($b < $a and $a < $c) or             ($c < $a and $a < $b))    return $a;     else    return $c;}     // Driver Code    $a = 20;    $b = 30;    $c = 40;    echo middleOfThree($a, $b, $c);     // This code is contributed by anuj_67.?>
<script> // Javascript program to find  middle of three distinct// numbers function middleOfThree( a,  b, c){    // Checking for b    if ((a < b && b < c) || (c < b && b < a))       return b;     // Checking for a    else if ((b < a && a < c) || (c < a && a < b))       return a;     else       return c;}     // driver code     let a = 20, b = 30, c = 40;    document.write(middleOfThree(a, b, c));     </script>
30
Time Complexity: O(1)Auxiliary Space: O(1)
But approach used above is not efficient because of extra comparisons, which can be easily minimized. In case first part is false, it will execute remaining half to check the condition. This problem remains same if we are checking for a also. 
Better Approach (Needs less comparison):
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find middle of three distinct// numbers#include <bits/stdc++.h>using namespace std; // Function to find the middle of three numbersint middleOfThree(int a, int b, int c){    // Compare each three number to find middle    // number. Enter only if a > b    if (a > b)    {        if (b > c)            return b;        else if (a > c)            return c;        else            return a;    }    else    {        // Decided a is not greater than b.        if (a > c)            return a;        else if (b > c)            return c;        else            return b;    }} // Driver Codeint main(){    int a = 20, b = 30, c = 40;    cout << middleOfThree(a, b, c);    return 0;}
// Java program to find middle of// three distinct numbersimport java.util.*; class Middle{      // Function to find the middle of three number    public static int middleOfThree(int a, int b,                                          int c)    {        // Compare each three number to find        // middle number. Enter only if a > b        if (a > b)        {            if (b > c)                return b;            else if (a > c)                return c;            else                return a;        }        else        {            // Decided a is not greater than b.            if (a > c)                return a;            else if (b > c)                return c;            else                return b;        }    }         // driver code    public static void main(String[] args)    {        int a = 20, b = 30, c = 40;        System.out.println(middleOfThree(a, b, c));    }} // This code is contributed by rishabh_jain
# Python3 program to find middle# of three distinct numbers # Function to find the middle of three numbersdef middleOfThree(a, b, c) :         # Compare each three number to find    # middle number. Enter only if a > b    if a > b :        if (b > c):            return b        elif (a > c) :            return c        else :            return a    else:        # Decided a is not greater than b.        if (a > c) :            return a        elif (b > c) :            return c        else :            return b # Driver Codea = 20b = 30c = 40print( middleOfThree(a, b, c) ) # This code is contributed by rishabh_jain
// C# program to find middle of// three distinct numbersusing System; class Middle{    // Function to find the middle of three number    public static int middleOfThree(int a, int b,                                            int c)    {        // Compare each three number to find        // middle number. Enter only if a > b        if (a > b)        {            if (b > c)                return b;            else if (a > c)                return c;            else                return a;        }        else        {            // Decided a is not greater than b.            if (a > c)                return a;            else if (b > c)                return c;            else                return b;        }    }         // Driver code    public static void Main()    {        int a = 20, b = 30, c = 40;        Console.WriteLine(middleOfThree(a, b, c));    }} // This code is contributed by vt_m
<?php// PHP program to find middle// of three distinct numbers // Function to find the middle// of three numbersfunction middleOfThree( $a, $b, $c){         // Compare each three number    // to find middle number.    // Enter only if a > b    if ($a > $b)    {        if ($b > $c)            return $b;        else if ($a > $c)            return $c;        else            return $a;    }    else    {                 // Decided a is not        // greater than b.        if ($a > $c)            return $a;        else if ($b > $c)            return $c;        else            return $b;    }}     // Driver Code    $a = 20; $b = 30;    $c = 40;    echo middleOfThree($a, $b, $c); // This code is contributed by anuj_67.?>
<script>    // Javascript program to find middle of three distinct numbers         // Function to find the middle of three number    function middleOfThree(a, b, c)    {        // Compare each three number to find        // middle number. Enter only if a > b        if (a > b)        {            if (b > c)                return b;            else if (a > c)                return c;            else                return a;        }        else        {            // Decided a is not greater than b.            if (a > c)                return a;            else if (b > c)                return c;            else                return b;        }    }         let a = 20, b = 30, c = 40;    document.write(middleOfThree(a, b, c));         // This code is contributed by divyesh072019.</script>
30
Time Complexity: O(1)Auxiliary Space: O(1)This approach is efficient and having less number of comparisons. Outer IF loop will only be executed if a > b otherwise, outer ELSE will be executed. 
Other Efficient Approach:
This approach is condensed version of the 1st approach.
(a>b and b>c) or (a<b and b<c) can also be decoded as a-b>0, b-c>0 or a-b<0,b-c<0 means the difference of a, b and b, c should be of same sign. So let x = a-b and y = b-c and if x, y have same sign then their result will be always positive. So b is middle element.
Similarly we can check for c and a.
let z = c – a and if  (b < a and a < c) or (c < a and a < b) can be decoded as a-b>0 , c-a>0 or a-b < 0, c-a<0 means x*z > 0. So the middle element will be a.
C++
Java
Python3
C#
PHP
Javascript
// CPP program to find middle of three distinct// numbers#include <bits/stdc++.h>using namespace std; // Function to find the middle of three numberint middleOfThree(int a, int b, int c){    // x is positive if a is greater than b.    // x is negative if b is greater than a.    int x = a - b;     int y = b - c;  // Similar to x    int z = a - c;  // Similar to x and y.     // Checking if b is middle (x and y both    // are positive)    if (x * y > 0)        return b;     // Checking if c is middle (x and z both    // are positive)    else if (x * z > 0)        return c;    else        return a;} // Driver Codeint main(){    int a = 20, b = 30, c = 40;    cout << middleOfThree(a, b, c);    return 0;}
//java program to find middle of three distinct// numbersimport java.util.*; class Middle{      // Function to find the middle of three number    public static int middleOfThree(int a, int b,                                          int c)    {        // x is positive if a is greater than b.        // x is negative if b is greater than a.        int x = a - b;         int y = b - c; // Similar to x        int z = a - c; // Similar to x and y.         // Checking if b is middle (x and y        // both are positive)        if (x * y > 0)            return b;         // Checking if c is middle (x and z        // both are positive)        else if (x * z > 0)            return c;        else            return a;    }         // driver code    public static void main(String[] args)    {        int a = 20, b = 30, c = 40;        System.out.println( middleOfThree(a, b, c) );    }} // This code is contributed by rishabh_jain
# Python3 program to find middle# of three distinct numbers # Function to find the middle of three numberdef middleOfThree(a, b, c) :         # x is positive if a is greater than b.    # x is negative if b is greater than a.    x = a - b     # Similar to x    y = b - c         # Similar to x and y.    z = a - c     # Checking if b is middle (x and y    # both are positive)    if x * y > 0:        return b     # Checking if c is middle (x and z    # both are positive)    elif (x * z > 0) :        return c    else :        return a # Driver Codea = 20b = 30c = 40print(middleOfThree(a, b, c)) # This code is contributed by rishabh_jain
//C# program to find middle of three distinct// numbersusing System; class Middle{    // Function to find the middle of three number    public static int middleOfThree(int a, int b,                                        int c)    {        // x is positive if a is greater than b.        // x is negative if b is greater than a.        int x = a - b;                 // Similar to x        int y = b - c;                  // Similar to x and y.        int z = a - c;         // Checking if b is middle (x and y        // both are positive)        if (x * y > 0)            return b;         // Checking if c is middle (x and z        // both are positive)        else if (x * z > 0)            return c;        else            return a;    }         // Driver code    public static void Main()    {        int a = 20, b = 30, c = 40;        Console.WriteLine( middleOfThree(a, b, c) );    }} // This code is contributed by vt_m
<?php// PHP program to find middle// of three distinct numbers // Function to find the// middle of three numberfunction middleOfThree($a, $b, $c){         // x is positive if a    // is greater than b.    // x is negative if b    // is greater than a.    $x = $a - $b;     // Similar to x    $y = $b - $c;         // Similar to x and y.    $z = $a - $c;     // Checking if b is    // middle (x and y both    // are positive)    if ($x * $y > 0)        return $b;     // Checking if c is    // middle (x and z both    // are positive)    else if ($x * $z > 0)        return $c;    else        return $a;}     // Driver Code    $a = 20;    $b = 30;    $c = 40;    echo middleOfThree($a, $b, $c); // This code is contributed by anuj_67.?>
<script> // javascript program to find middle of//  three distinct numbers      // Function to find the middle of three number    function middleOfThree(a, b, c)    {        // x is positive if a is greater than b.        // x is negative if b is greater than a.        let x = a - b;          let y = b - c; // Similar to x        let z = a - c; // Similar to x and y.          // Checking if b is middle (x and y        // both are positive)        if (x * y > 0)            return b;          // Checking if c is middle (x and z        // both are positive)        else if (x * z > 0)            return c;        else            return a;    }     // Driver code         let a = 20, b = 30, c = 40;        document.write( middleOfThree(a, b, c) ); </script>
30
Time Complexity: O(1)Auxiliary Space: O(1)
vt_m
jana_sayantan
susmitakundugoaldanga
divyesh072019
singhh3010
ashutoshkatkam
manojkumarmanusai
C++
Searching
Technical Scripter
Searching
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Sorting a vector in C++
Polymorphism in C++
Friend class and function in C++
std::string class in C++
Pair in C++ Standard Template Library (STL)
Binary Search
Maximum and minimum of an array using minimum number of comparisons
Linear Search
K'th Smallest/Largest Element in Unsorted Array | Set 1
Search an element in a sorted and rotated array