This document provides an introduction to algorithm design and analysis. It discusses sorting as an example problem, comparing the insertion sort and merge sort algorithms. Insertion sort runs in O(n^2) time while merge sort runs in O(nlogn) time, making merge sort faster for large inputs. The document explains the recursive definitions and analyses of these algorithms' runtimes. It also introduces asymptotic notation and techniques for algorithm analysis such as recurrence relations and decision trees. Finally, it briefly discusses NP-complete problems.