Algorithms In Java, Parts 1-4 by Robert Sedgewick