| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 
 | void up(int* a, int u) {
 while (u > 0) {
 int p = (u - 1) >> 1;
 if (a[p] >= a[u]) break;
 swap(a[p], a[u]);
 u = p;
 }
 }
 
 void down(int* a, int last, int u) {
 int cl = (u << 1) + 1;
 while (cl <= last) {
 if (cl + 1 <= last && a[cl] < a[cl + 1]) ++cl;
 if (a[u] >= a[cl]) break;
 swap(a[u], a[cl]);
 u = cl;
 cl = (u << 1) + 1;
 }
 }
 
 void heap_sort(int* a, int len) {
 for (int i = 0; i < len; i++) up(a, i);
 int last = len - 1;
 while (last > 0) {
 swap(a[0], a[last--]);
 down(a, last, 0);
 }
 }
 
 |