Old school would be Wirth; he's done several data structures books. That's where a lot of the fundamentals got laid down.<p>Hard core is Knuths' "The Art of Computer Programming", but tackling it is somewhat akin to asking how to tell time and being shown, in exquisite (or excruciating) detail how to build a clock.<p>I think I learned the most/fastest from Sedgewick (Intro to the Analysis or Algorithms, Algorithms in C (or C++ or Java)). His style worked for me; YMMV. The book Rivest, Cormen, et. al wrote (Intro to Algorithms) is also very good, as is the Aho algorithms book.
For a different but useful approach, one book I liked is:<p>How to Solve it by Computer - by R. G. Dromey, a lecturer or professor at a university in Australia, IIRC:<p><a href="http://en.wikipedia.org/wiki/How_to_Solve_it_by_Computer" rel="nofollow">http://en.wikipedia.org/wiki/How_to_Solve_it_by_Computer</a><p>Acording to Wikipedia (and also mentioned in his book, IIRC), Dromey was inspired by the techniques of the book "How to Solve it" by George Polya, a famous mathematician, and applied some of his techniques to programming with data structures and algorithms.<p><a href="http://en.wikipedia.org/wiki/George_P%C3%B3lya" rel="nofollow">http://en.wikipedia.org/wiki/George_P%C3%B3lya</a><p>But he doesn't just translate the Polya book from the domain of mathematics to software; he builds up the solution to each problem posed in his book, in an incremental way, sort of as he discovers or invents them, sharing the reasoning behind the decisions as he goes along. I found this to be one of the good features of the book.<p>I had the good fortune to read Polya's book too, early on in college - I think it was rare even then. It had gems like "solve the more general problem" (if there is one), which will automatically solve the specific problem you are working on, as just another special case, and some times the solution to the more general problem may turn out to be simpler than the solution to the specific problem. But the book has much more than that, in terms of problem-solving advice.
I like The Algorithm Design Manual[0] by Steve Skiena. He actually discovered that students fared better with real code (written in C) as opposed to pseudo-code.<p>0 - <a href="http://www.algorist.com/" rel="nofollow">http://www.algorist.com/</a>
I would recommend "Purely Functional Data Structures" by Chris Okasaki. It's not only for functional programmers - there is also a bunch of structures useful in imperative languages.
Not a book but Wikipedia is awesome. Just start with a subject and branch away. No book covers the breadth of Wikipedia. Of course a book might be better for depth.