The document describes the merge sort algorithm. It begins by explaining the divide and conquer approach to algorithm design, which merge sort uses. It then provides pseudocode that divides the input array into two halves, recursively sorts each half using merge sort, and then merges the two sorted halves back together. The document includes examples walking through applying merge sort to an array. It analyzes the running time of merge sort using recurrence relations and the substitution method, determining its runtime is O(n log n). Finally, it provides Java code implementing merge sort.