The focus of this course is on how to design good algorithms, and how to analyze their efficiency. It explains how to compare and analyze the primary sorting and searching algorithms. It illustrates the behavior of the algorithm with respect to the best, worst, and average case running times. In addition, it describes the divide-and-conquer, greedy, dynamic programming, backtracking, and branch-and-bound methods and their implementations. It also covers the essential topics of algorithms design and analysis from a mathematical perspective.