Algorithms in Java, Parts 1-4 - Sedgewick