Computer Science 210
Data Structures
Fall 2017, Siena College
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.
/**
Sample methods for binary search: one for int values only,
one that uses Comparable Object references.
@author Jim Teresco, jteresco@mtholyoke.edu, jteresco@siena.edu
Original based on example code by Williams College faculty, used
and extended by Jim Teresco at Williams College, Mount Holyoke
College, The College of Saint Rose, and Siena College
*/
import java.util.Random;
public class BinSearch {
/**
Binary search on an array of int
@param a the input array
@param val int to find in the array
@pre a is sorted in ascending order
@return index of val in a, or -1 if not found
*/
public static int search (int[] a, int val) {
return binsearch(a, 0, a.length-1, val);
}
/**
Helper method to support additional parameters needed by
the recursive binary search on array of int
@param a the entire input array
@param low lowest index where val may be found
@param high highest index where val may be found
@param val int to find in the array
@return index of val in a, or -1 if not found
*/
protected static int binsearch(int[] a, int low, int high, int val) {
// is there still a range where we need to search?
if (low <= high) {
// compute the middle location of the range, where we
// will look for our element
int mid = (low + high) / 2;
if (val < a[mid]) {
// val is smaller than the element at the midpoint,
// so it could only be found in the first half.
// The following recursive call looks exactly there:
// from the bottom of our search range up to but
// not including the midpoint position (which we know
// doesn't contain val)
return binsearch(a, low, mid - 1, val);
}
else if (a[mid] < val) {
// Same idea: val is larger than the midpoint, so it
// could only be in second half, so we make an
// appropriate recursive call
return binsearch(a, mid + 1, high, val);
}
else {
// it wasn't too small, and it wasn't too big, so
// we found val at a[mid]! Return the index.
return mid;
}
}
else {
// there's no range left to search, so report that
// we didn't find val by returning -1
return -1;
}
}
/**
Binary search on an array of Comparable objects
@param a the input array
@param val the Comparable value to find in the array
@pre all elements in a and val must implement Comparable
@pre a is sorted in ascending order
@return index of val in a, or -1 if not found
*/
public static <T extends Comparable> int search (T[] a, T val) {
return binsearch(a, 0, a.length -1, val);
}
/**
Helper method for binary search on array of Comparables
@param a the entire input array
@param low lowest index where val may be found
@param high highest index where val may be found
@param val Comparable element to find in the array
@return index of val in a, or -1 if not found
*/
protected static <T extends Comparable> int binsearch(T[] a, int low, int high, T val) {
if (low <= high) {
// there is still a range of indices to search
int mid = (low + high) / 2;
if (val.compareTo(a[mid]) < 0) {
// value at midpoint too large, search first half
return binsearch(a, low, mid - 1, val);
}
else if (a[mid].compareTo(val) < 0) {
// value at midpoint too small, search second half
return binsearch(a, mid + 1, high, val);
}
else {
// it's at the midpoint
return mid;
}
}
else {
// the search range has no elements, so val can't be here
return -1;
}
}
/**
Example usage of the binary search methods
*/
public static void main(String[] args) {
Random r = new Random();
final int NUM_INTS = 100;
final int MAX_INCREMENT = 10;
int[] orderedInts = new int[NUM_INTS];
Integer[] orderedIntegers = new Integer[NUM_INTS];
// we'll put some random but ascending numbers into our arrays
int val = r.nextInt(MAX_INCREMENT) + 1;
orderedInts[0] = val;
orderedIntegers[0] = val; // will be autoboxed
for (int i = 1; i < NUM_INTS; i++) {
val = orderedInts[i-1] + r.nextInt(MAX_INCREMENT) + 1;
orderedInts[i] = val;
orderedIntegers[i] = val;
}
// print it
System.out.println("Array to search:");
for (int n : orderedInts) {
System.out.print(n + " ");
}
System.out.println();
// let's see which multiples of half the increment are here
// so we should have some matches and some not -- note
// we know the first will be a search for a value (0) which
// is smaller than all in the array, and the last will be
// larger than the last (largest) value
for (int i = 0;
i <= orderedInts[NUM_INTS-1] + MAX_INCREMENT;
i += MAX_INCREMENT/2) {
System.out.println("Searching for " + i + ": int array: " +
search(orderedInts, i) + ", Integer array: " +
search(orderedIntegers, i));
}
// the great thing is that we can create arrays of other kinds
// as well, as long as they're Comparables
// note these elements will each be autoboxed from double to Double
Double[] orderedDoubles = { -10.5, -6.0, 0.0, 3.5, 9.1, 17.23 };
System.out.println("Search for Double values, array to search:");
for (double n : orderedDoubles) {
System.out.print(n + " ");
}
System.out.println();
System.out.println("Search for -5.0: " + search(orderedDoubles, -5.0));
System.out.println("Search for 0.0: " + search(orderedDoubles, 0.0));
System.out.println("Search for 5.0: " + search(orderedDoubles, 5.0));
System.out.println("Search for 9.1: " + search(orderedDoubles, 9.1));
// and Strings work too
String[] orderedStrings = {
"Alice", "Bob", "Carol", "David", "Ellen", "Frank", "Gloria",
"Hal", "Isabelle", "Joey", "Kimberly", "Larry" };
System.out.println("Search for String values, array to search:");
for (String s : orderedStrings) {
System.out.print(s + " ");
}
System.out.println();
System.out.println("Search for Abby: " + search(orderedStrings, "Abby"));
System.out.println("Search for Carol: " + search(orderedStrings, "Carol"));
System.out.println("Search for Joey: " + search(orderedStrings, "Joey"));
System.out.println("Search for Zachary: " + search(orderedStrings, "Zachary"));
}
}