This textbook focuses on designing algorithms, proving their correctness, and analyzing their efficiency. In particular, the emphasis is on analyzing the cost associated with different algorithms, studying the essential mathematical tools for analyzing algorithm cost, and exploring design heuristics and how subtle choices can affect time complexity. Some time is spent carefully analyzing algorithms using sorted schemes, probabilistic and statistical schemes, and graph algorithms.