Unlike TAOCP and CLRS it's actually readable in realistic amount of time.
This book is also very good at explaining theoretical computer science. In particular - NP completeness.
Official copy is available at home page of Umesh Vazirani at berkeley.edu:
0: Prologue - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap0....
1: Algorithms with numbers - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap1....
2: Divide-and-conquer algorithms - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap2....
3: Decompositions of graphs - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap3....
4: Paths in graphs - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap4....
5: Greedy algorithms - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap5....
6: Dynamic programming - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap6....
7: Linear programming and reductions - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap7....
8: NP-complete problems - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap8....
9: Coping with NP-completeness - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap9....
10: Quantum algorithms - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap10...