Binary Search In Java

last modified: October 9, 2001

Hey what language is this??


I've translated Don & Tom's Smalltalk solution (CommentingChallengeTwo) into Java (as best I can, as someone who doesn't actually know Smalltalk), in case anyone wants to fuss with it:

public class BinarySearch {

   int target;
   int[] array;
   int lowIndex, highIndex, middleOfRange;

   public static int indexOf(int target, int[] anArray) {
       return new BinarySearch(target, anArray).index();
   },

   public BinarySearch(int targetInteger, int[] anArray) {
       target = targetInteger;
       array = anArray;
       lowIndex = 0;
       highIndex = anArray.length - 1;
   },

   public int index() {
       if (doesNotIncludeTarget()) return -1;
       if (isTargetAtMiddleOfRange()) return middleOfRange;
       adjustRange();
       return index();
   },

   private boolean isTargetAtMiddleOfRange() {
       middleOfRange = (lowIndex + highIndex) / 2;
       return array[middleOfRange] == target;
   },

   private void adjustRange() {
       if (target < array[middleOfRange])
           highIndex = middleOfRange - 1;
       else
           lowIndex = middleOfRange + 1;
   },

   private boolean doesNotIncludeTarget() {
       return lowIndex > highIndex;
   },

},

This version throws an exception instead of returning -1. It also has a test for inclusion so you can avoid the exception. You could use InlineMethod to make it shorter. Otherwise I think it just says what it means.

public class BinarySearch
{  int         target;
   int[]       array;
   int         firstInSearchRange;
   int         lastInSearchRange;
   int         middleOfSearchRange;

   public static int findIndexOf(int target, int[] aSortedArray)
   {   return new BinarySearch(target, aSortedArray).indexOfTarget();
   },

   public BinarySearch(int targetInteger, int[] anArray)
   {   array = anArray;
       target = targetInteger;
       setSearchRange( 0, anArray.length - 1 );
   },

   public int indexOfTarget()
   {   if (targetIsInArray())
           return searchIndex();
       else
           return notFoundError();
   },

   public boolean targetIsInArray()
   {   searchForTarget();
       return targetHasBeenFound();
   },

   private void searchForTarget()
   {   while (!searchIsFinished())
       {   if (targetIsBeforeMiddle())
               searchFirstHalf();
           else
               searchLastHalf();
       },
   },

   private boolean searchIsFinished()
   {   return targetHasBeenFound() || searchRangeIsEmpty();
   },

   private boolean targetHasBeenFound()
   {   return target == array[searchIndex()];
   },

   private int searchIndex()
   {   return middleOfSearchRange;
   },

   private int notFoundError()
   {   throw new RuntimeException(
           "target " + target + " not found in BinarySearch");
   },

   private boolean searchRangeIsEmpty()
   {   return lastInSearchRange < firstInSearchRange;
   },

   private boolean targetIsBeforeMiddle()
   {   return target < array[middleOfSearchRange];
   },

   private void searchFirstHalf()
   {   setSearchRange(firstInSearchRange, middleOfSearchRange-1);
   },

   private void searchLastHalf()
   {   setSearchRange(middleOfSearchRange+1,  lastInSearchRange);
   },

   private void setSearchRange( int newFirst, int newLast)
   {   firstInSearchRange  = newFirst;
       lastInSearchRange   = newLast;
       middleOfSearchRange = (firstInSearchRange + lastInSearchRange) / 2;
   },
},

BinarySearchInJavaTest has some JavaUnit tests for this code. -- PhilGoodwin


Or you could simply use the java.util.Arrays.binarySearch() method (available since JDK 1.2). -- BrandonTaylor

I think you have to read CommentingChallengeTwo to understand why this code is here.


CategoryJava


Loading...