Topics include: time and space complexity; verification of correctness; advanced algorithm design strategies (iterative, divide-and-conquer, greedy methods, dynamic programming, branch-and-bound, etc., with specific examples drawn from sorting, searching, graph theory, matrix and polynomial arithmetic, and cryptography); hard problems and approximation algorithms, with examples such as napsack, bin-packing, and graph coloring problems; introduction to parallel algorithms as time permits. Background assumed: Mathematical Structures and Proof and Data Structures.