This introductory course defines what an algorithm is, and shows how to measure performance and compare algorithms using asymptotic notation. It shows how to analyze algorithms by solving recurrences using substitution, recursion-tree and master theorem. It formulates sorting problems, and discusses sorting algorithms such as Bubble Sort, Selection Sort, Insertion Sort, Merge Sort, Quick sort, Heap sort, and Linear Time sorting. It shows graph representation and graph traversal algorithms such as Breadth-first search and Depth-first search. It introduces dynamic programming, then shows useful applications such as: Longest Common Subsequence (LCS), Matrix multiplication, shortest paths and Traveling Salesman problems (TSP). The course also covers designing algorithms and advanced topics such as Comparative computing, Parallel algorithms and Heuristics.