Computer Science 523
Advanced Programming

Summer 2014, The College of Saint Rose

BinSearch Demo

A working demo of BinSearch will appear below. Click inside the applet to interact with it.



BinSearch BlueJ Project

Click here to download a BlueJ project for BinSearch.


BinSearch Source Code

The Java source code for BinSearch is below. Click on a file name to download it.


BinSearch.java

/* 
   $Id: BinSearch.java 2220 2013-10-18 17:15:08Z terescoj $ 
*/
/**
   Sample methods for binary search
 
   @author Jim Teresco, jteresco@mtholyoke.edu
*/

public class BinSearch {

    /**
       Binary search on an array of int

       @param elts input array
       @param findElt int to find in the array
       @pre elts is sorted in ascending order
       @return index of findElt in elts, or -1 if not found
    */
    public static int search (int[] elts, int findElt) {
        return binsearch(elts, 0, elts.length -1, findElt);
    }
    
    /**
       Helper method for binary search on array of int

       @param elts entire input array
       @param low lowest index where findElt may be found
       @param high highest index where findElt may be found
       @param findElt int to find in the array
       @return index of findElt in elts, or -1 if not found
    */
    protected static int binsearch(int[] elts, int low, int high, int findElt) {
        if (low <= high) {
            int mid = (low + high) / 2;
            if (findElt < elts[mid])       // findElt can only be in 1st half
                return binsearch(elts, low, mid - 1, findElt);
            else if (elts[mid] < findElt)  // findElt can only be in 2nd half
                return binsearch(elts, mid + 1, high, findElt);
            else                           // found findElt!
                return mid;
        }
        else
            return -1;                  // Didn't find findElt.
    }

    /**
       Binary search on an array of Comparable objects

       @param elts input array
       @param findElt Comparable to find in the array
       @pre all elts and findElt must implement Comparable
       @pre elts is sorted in ascending order
       @return index of findElt in elts, or -1 if not found
    */
    public static <T extends Comparable> int search (T[] elts, T findElt) {
        return binsearch(elts, 0, elts.length -1, findElt);
    }

    /**
       Helper method for binary search on array of Comparables

       @param elts entire input array
       @param low lowest index where findElt may be found
       @param high highest index where findElt may be found
       @param findElt Comparable to find in the array
       @return index of findElt in elts, or -1 if not found
    */
    protected static <T extends Comparable> int binsearch(T[] elts, int low, int high, T findElt) {
        if (low <= high) {
            int mid = (low + high) / 2;
            if (findElt.compareTo(elts[mid]) < 0)  // it must be in 1st half
                return binsearch(elts, low, mid - 1, findElt);
            else if (elts[mid].compareTo(findElt) < 0)  // in 2nd half
                return binsearch(elts, mid + 1, high, findElt);
            else                           // found findElt!
                return mid;
        }
        else
            return -1;                  // Didn't find findElt.
    }

    /**
       Demonstration of linear and binary searches
    */
    public static void main(String[] args) {

	final int size = 100;
	int[] orderedInts = new int[size];
	Integer[] orderedIntegers = new Integer[size];

	for (int i=0; i<size; i++) {
	    // some ordered and not very random numbers
	    orderedInts[i] = 2*i;
	    orderedIntegers[i] = new Integer(2*i);
	}

	// do some searching for some random-ish values, some of which are
	// in the arrays and some of which are not
	for (int i=3; i<2*size; i+=5) {
	    System.out.println("Searching for "+i+":");
	    System.out.println("int array: " + search(orderedInts, i));
	    System.out.println("Integer array: " + 
			       search(orderedIntegers, i));
	}
    }
}