Heapsort
template <class RAIter>
void g_heap_sort (RAIter beg, RAIter end)
{
if (end - beg <= 1)
return;
size_t size = end - beg, k;
// push elements onto heap one at a time
for (k = 0; k < size; ++k)
g_push_heap(beg, beg + (k + 1));
// keep popping largest remaining element to end of remaining range
for (k = size; k > 1; --k)
g_pop_heap(beg, beg + k);
}
in place
not stable
run time = Θ(n log n)
requires random access iterators