To be an algorithm designer, you have to do some steps.
First, learn the basics of algorithmic thinking. You can learn it by using a simple programming language book. Choosing the language is not important. You can take a look at this page for finding a book. After finishing this step, you have to be able to present pseudocode (or code written in a specific language) for simple problems, for example:
- Searching in a list: there is a list of numbers, and we want to see a specific number is in the list or not.
- Sorting a list
- Finding the greatest common divisor of two numbers
Second, learn the important data structures— link-list, stack, queue, and tree— and their algorithms. For doing this step, you can read the books of data structure written for bachelor students of computer science. For example, Fundamentals of Data Structures by Ellis Horowitz and Sartaj Sahni is a good book. At the end of this step, you have to know/do the following things:
- What is a data structure? How we can iterate over the elements of a data structure? How we can add a new item(/remove an item) from the data structure?
- What are the main features of each data structure?
Third, learn conventional algorithm design techniques— divide and conquer, dynamic programming, greedy, back-track, branch and bound. For doing this step, you can read the algorithm design books written for bachelor students of computer science. For example:
- Foundations Of Algorithms, Richard Neapolitan
- Introduction to Algorithms, Thomas H. Cormen, et al. (Chapters 1-17)
After doing this step, you can solve a large range of algorithmic problems, like the problems that can be found on this website: onlinejudge.org.
Forth, learn specialized algorithm design techniques, like randomized algorithmic techniques, parallel algorithmic techniques, distributed algorithmic techniques, approximation algorithmic techniques, etc. For each case, there are some books written for graduate students of computer science.
Besides, there are some other steps, like learning the basics of the theory of computing, complexity classes (NP-complete and P-complete theories), and a lot of other things. It depends on your goal and the level that you want to be reached.