/**
 * BinarySearchR.java
 * <br>
 * A class to demonstrated recursive binary search on a sorted array.
 * <br>
 * Created: Tue Feb 11 14:30:59 2003
 *
 * @author <a href="mailto:shapiro@cse.buffalo.edu">Stuart C. Shapiro</a>
 */

public class BinarySearchR {

    /**
     * Returns the index within the array a of the first occurrence of the int i,
     * or -1 if i does not occur in a.
     * <p> The search range is a[min .. max].<p>
     * a is assumed to be sorted from lower to higher ints.
     *
     * @param a the sorted <code>int[]</code> to be searched.
     * @param min is the smallest index of a where x might be.
     * @param max is largest index of a where x might be.
     * @param i an <code>int</code> value to search for.
     * @return the index of the first occurrence of i in a,
     * or -1 if i does not occur in a.
     */
    public static int indexOf(int[] a, int min, int max, int i) {
	if (min > max) return -1;
	int mid = (min + max) / 2;
	if (i == a[mid]) return mid;
	else if (i < a[mid]) return indexOf(a, min, mid-1, i);
	else return indexOf(a, mid+1, max, i);
    }

    /**
     * Tests the indexOf method.
     *
     */
    private static void test(int[] a, int lo, int hi, int i) {
	System.out.print(i + " is at position "
			   + indexOf(a, lo, hi, i) + " of "
			 + "\t{" + a[0]);
	for (int j = 1; j < a.length; j++) {System.out.print(", " + a[j]);}
	System.out.println("}");
    }

    /**
     * Demonstrates recursive binary search.
     *
     * @param args a <code>String[]</code> value
     */
    public static void main (String[] args) {
	int[] testarray = {2,4,25,43,43,46,54,54,85,285,541,564};
	test(testarray, 0, testarray.length-1, 54);
	test(testarray, 0, testarray.length-1, 1);
	test(testarray, 0, testarray.length-1, 99);
	test(testarray, 0, testarray.length-1, 999);
    } // end of main ()
    
    
}// BinarySearchR
