/// Binary search that prints each step.
int binarySearchVerbose(int[] items, int target) {
    int low = 0;
    int high = items.length - 1;
    int step = 0;

    while (low <= high) {
        step++;
        int middle = (low + high) / 2;
        IO.println("Step " + step + ": checking index " + middle
                + " (value " + items[middle] + "), "
                + (high - low + 1) + " items still in range");

        if (items[middle] == target) {
            return middle;
        } else if (items[middle] < target) {
            low = middle + 1;
        } else {
            high = middle - 1;
        }
    }

    return -1;
}

void main() {
    int[] numbers = new int[50];
    for (int i = 0; i < numbers.length; i++) {
        numbers[i] = i * 2;
    }

    int result = binarySearchVerbose(numbers, 74);
    IO.println("Found at index " + result);
}

// From Groundwork, chapter 11 (ch11-searching-and-sorting), box 3.
// This example is from Groundwork, licensed CC BY-NC-SA 4.0.
// Run with: java ch11_03.java
