Bottom-Up Merge Sort
void merge_sort_bu (A, n)
{
if (n < 2) return;
for (size_t i = 1; i < n; i = i+i)
{
for (size_t j = 0; j < n - i; j += i+i)
{
if (n < j+i+i) // possible at last step
merge(A + j, A + j+i, A+n);
else
merge(A + j, A + j+i, A + j+i+i);
}
}
}
- Stable
- Runtime = Θ(n log n)
- Runspace = +Θ(n)
- No way around #3 for arrays, vectors, deques
- Can eliminate #3 for lists!