#include <iostream>
using namespace std;

void downUpdate(int *arr, int n, int ind) {
while ((ind << 1) <= n) {
int temp = ind, l = temp << 1, r = temp << 1 | 1;
if (arr[temp] > arr[l]) temp = l;
if (r <= n && arr[temp] > arr[r]) temp = r;
if (temp == ind) break;
swap(arr[temp], arr[ind]);
ind = temp;
}
return;
}
void heap_sort(int* arr, int n) {
arr -= 1;
//建堆
for (int i = n >> 1; i >= 1; i--) {
downUpdate(arr, n, i);
}
//堆排序
for (int i = n; i > 1; i--) {
swap(arr[i], arr[1]);
downUpdate(arr, i- 1, 1);
}
return;
}

void output(int* arr, int n) {
printf("[");
for (int i = 0; i < n; i++) {
i&& printf(" ");
printf("%d", arr[i]);
}
printf("]\n");
return;
}
int main() {
srand(time(0));
#define MAX_N 20
int arr[MAX_N] = { 0 };
for (int i = 0; i < MAX_N; i++) {
arr[i] = rand() % 100;
}
output(arr, MAX_N);
heap_sort(arr, MAX_N);
output(arr, MAX_N);
#undef MAX_N
return 0;
}