This course covers efficient algorithms for sorting, searching, and selection. Students explore algorithm analysis - worst and average case analysis - recurrences and asymptotics, and data structures such as balanced trees, heaps, and hash tables. They learn algorithm design techniques - divide-and-conquer, dynamic programming, greedy algorithms, amortized analysis - and work on algorithms for fundamental graph problems such as depth-first search, connected components, topological sort, and shortest paths.