#include <algorithm> // for std::swap().
template <typename T>
static void
bubble_up(T a[], unsigned i) {
while (i > 0) {
const unsigned p = i/2;
if (a[p] ≥ a[i])
break;
std::swap(a[p], a[i]);
}
}
template <typename T>
static void
bubble_down(T heap[], unsigned n) {
unsigned i = 0;
while (true) {
unsigned c = 2*i + 1;
const unsigned c1 = 2*(i + 1);
if (c ≥ n)
break;
if ((c1 < n) and (heap[c] < heap[c1]))
c = c1;
if (heap[i] ≥ heap[c])
break;
std::swap(heap[i], heap[c]);
i = c;
}
}
template <typename T>
void
heap_sort(T a[], unsigned n) {
for (unsigned i = 1; i < n; i++)
bubble_up(a, i);
for (unsigned i = n - 1; i > 0; i--) {
std::swap(a[0], a[i]);
bubble_down(a, i);
}
This page last modified on 24 January 2006.