Algorithms, Part I  by Robert Sedgewick and Kevin Wayne