MathBits.com
Return to Unit Menu | Java Main Page | MathBits.com | Terms of Use
 

Binary Search

Do you remember playing the game "Guess a Number", where the responses to the statement "I am thinking of a number between 1 and 100" are "Too High", "Too Low", or "You Got It!"?  A strategy that is often used when playing this game is to divide the intervals between the guess and the ends of the range in half.  This strategy helps you to quickly narrow in on the desired number. 

When searching an array, the binary search process utilizes this same concept of splitting intervals in half as a means of finding the "key" value as quickly as possible.

If the array that contains your data is in order (ascending or descending), you can search for the key item much more quickly by using a binary search algorithm ("divide and conquer"). 

Consider the following array of integers:

Array of integers, named num, arranged in "ascending order"!!
13 24 34 46 52 63 77 89 91 100
num[0] num[1] num[2] num[3] num[4] num[5] num[6] num[7] num[8] num[9]

We will be searching for the integer 77:

  • First, find the middle of the array by adding the array subscript of the first value to the subscript of the last value and dividing by two:  (0 + 9) / 2 = 4    Integer division is used to arrive at the 4th subscript as the middle. (The actual mathematical middle would be between the 4th and 5th subscripts, but we must work with integer subscripts.) 

  • The 4th subscript holds the integer 52, which comes before 77.  We know that 77 will be in that portion of the array to the right of 52.  We now find the middle of the right portion of the array by using the same approach.  (5 + 9) / 2 = 7

  • The 7th subscript holds the integer 89, which comes after 77.  Now find the middle of the portion of the array to the right of 52, but to the left of 89. (5 + 6) / 2 = 5

  • The 5th subscript holds the integer 63, which comes before 77, so we subdivide again 
    (6 + 6) / 2 = 6   and the 6th subscript holds the integer 77.

Remember:  You must start with a pre-sorted array!!!

import java.io.*;
import BreezyGUI.*;

public class BinarySearchExample
{
     public static void main(String[] args)
    {
        int key = 77;
        int[ ] num = new int [10];
       
// Fill the array
        for (int i = 0; i < 10; i++)
             num[ i ]=Console.readInt("Enter integer:  ");
      
 //The binary search method  
        binarySearch (num, 0, 9, key); 
    }

 

Binary search method:
binarySearch (num, 0, 9, key); 

The arguments/parameters are:
  array - the name of a sorted array
  lowerbound - subscript (index) of first
        element to search, array[0]
  upperbound - subscript (index) of  
        last element to search, array[9]
   key:  item we wish to find.

  //Binary Search Method
  // This method accepts a pre-sorted array, the subscript of the starting element for the search,
  // the subscript of the ending element for the search,
  // and the key number for which we are searching.

   public static void binarySearch(int[ ] array, int lowerbound, int upperbound, int key)
   {
       int position;
       int comparisonCount = 1;  
 // counting the number of comparisons (optional)

    
// To start, find the subscript of the middle position.
     position = ( lowerbound + upperbound) / 2;

     while((array[position] != key) && (lowerbound <= upperbound))
     {
         comparisonCount++;
         if (array[position] > key)
             // If the number is > key, ..
         {                                              
// decrease position by one.
              upperbound = position - 1;  
         }                                                            
              else                                                  
        {                                                       

              lowerbound = position + 1;
   // Else, increase position by one.

        }
       position = (lowerbound + upperbound) / 2;
     }
     if (lowerbound <= upperbound)
     {
           System.out.println("The number was found in array subscript" + position);
           System.out.println("The binary search found the number after " + comparisonCount +
                 "comparisons.");
          
// printing the number of comparisons is optional
     }
     else
          System.out.println("Sorry, the number is not in this array.  The binary search made "
                 +comparisonCount  + " comparisons.");
  }

}

This method simply prints the result of the search.  You may wish to return the result of the binary search to be used in further investigations.  To do so, return the "position" if the value is found and return a negative number (for example) if the result is not found.
 


Return to Unit Menu | Java Main Page | MathBits.com | Terms of Use