Merge Sort
Recursively splits the array in half, then merges sorted halves back together.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function mergeSort(lo, hi) {
if (hi - lo <= 1) return;
const mid = (lo + hi) >> 1;
mergeSort(lo, mid);
mergeSort(mid, hi);
const left = [], right = [];
for (let i = lo; i < mid; i++) left.push(get(i));
for (let i = mid; i < hi; i++) right.push(get(i));
let i = 0, j = 0, k = lo;
while (i < left.length && j < right.length) {
if (left[i] <= right[j]) {
set(k++, left[i++]);
} else {
set(k++, right[j++]);
}
}
while (i < left.length) set(k++, left[i++]);
while (j < right.length) set(k++, right[j++]);
}
mergeSort(0, length);
BEST O(n log n)
AVG O(n log n)
WORST O(n log n)
SPACE O(n)
STABLEMerge Sort splits the array recursively until each piece has one element, then merges them back in sorted order. Guarantees O(n log n) time but needs extra memory for temporary arrays.
Edit in playground→