Here is a list of books I have read and I recommend:
- Introduction to Algorithms
It is hard to express how much I can recommend this book. My first contact with this masterpiece was in the high school, while I was trying to study algorithms for competitive programming. I could obtain some knowledge, but I was not 'mathematically literate' to appreciate the rigour and algorithm analysis discussions. Couple of years later, it was the university algorithms course textbook, and I could truly understand the material explained here.
For me, this is possibly the 'the best' of algorithms and data structures resources available. I think the best part is algorithm analysis, not the actual pseudocode which is sometimes hard to read. Analysis is usually very formal and many proofs regarding the complexity and correctness are extremely clear and usually very rigorous. I consider the pseudocode the only drawback and the fact the book uses 1-based array indexing (CLRS, why this?).
The authors clearly explain the need for certain algorithms and data-structures and discuss both theoretical and practical aspects.
Almost all sections have the accompanying exercises, thoroughly testing understanding. Some of them can be very interesting, usually end of chapter problems are hard. For example, after Red Black Trees chapter, AVL trees appear as an exercise to the reader <3.
My favourite parts are Heaps, Hash-Tables, the whole Graph Algorithms section and Dynamic Programming section. Personally, I found it very difficult to grasp dynamic programming concepts, but this textbook really explains it properly. There are plenty of worked-out examples, each thoroughly discussed with proofs regarding correctness, running time and even the practical implementation advice.
To sum up, there is also the accompanying online course taught at MIT. Learn more here.
Although it is not an easy read, I think it is one of 'must reads'.
Here is a list of books that are 'in priority queue':