This document discusses algorithms for sorting and searching. It introduces algorithm analysis and why it is important to analyze algorithms to compare different solutions, predict performance, and set parameter values. It discusses analyzing running time by counting primitive operations as a function of input size. Common growth rates like linear, quadratic, and cubic functions are introduced. Big-O notation is explained as a way to classify algorithms by their worst-case running time. Several specific sorting algorithms are described, including bubble sort, insertion sort, merge sort, and quicksort. Their pseudocode and running times are analyzed. Graph traversal algorithms like depth-first search and breadth-first search are also introduced.