Foundations of Algorithms, Fifth Edition (2015) by Richard E. Neapolitan. You can find it by Googling for the title plus “epub”.
I highly recommend this book to anyone learning systems programming. It is an approachable and example-filled text for computer science students, with an appendix setting out the prerequisite mathematics that I found to be an excellent refresher. There are a large number of exercises (although no answers, so you’ll have to do the grind of actually answering them yourself).
It particularly satisfied my need to understand the “Big O” notation for estimating the comparative efficiency of different algorithms for the same problem. Although there is a Wikipedia article on this, the book’s many examples helped a lot. I was prompted to look for such a text precisely because of stackoverflow.com comments on C+±tagged questions that use Big O notation in recommending this or that method.