#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1005;
int ch[20];
void heap(int* heap, int size) {
while(heap[size] > heap[(size - 1) / 2]) {//如果新进入的数比他的父亲节点的数大,就和他交换
int temp = heap[(size - 1) / 2];
heap[(size - 1) / 2] = heap[size];
heap[size] = temp;
size = (size - 1) / 2;
}
}
void heapx(int* ch, int p,int size) {
int flag;
if (p*2+1 < size) {//保证左孩子在size范围
int mc;
if (p * 2 + 2 < size&&ch[p * 2 + 2] > ch[p * 2 + 1]) {
mc = ch[p * 2 + 2];
flag = 1;
}
else {
mc= ch[p * 2 + 1];
flag = 0;
}
if (mc > ch[p]) {
if (flag) {
swap(ch[p], ch[p * 2 + 2]);
heapx(ch, p * 2 + 2, --size);
}
else {
swap(ch[p], ch[p * 2 + 1]);
heapx(ch, p * 2 + 1, --size);
}
}
}
}
int main()
{
cout << "输入要排序的个数:";
int n;
cin >> n;
int nn = n;
for (int i = 0; i < n; i++) {//先将要排序的数存放到数组里
cin >> ch[i];
}
for (int i = 0; i < n; i++) {//建立大堆
heap(ch, i);
}
while (n>0) {//数组的第一个数与最后一个数交换,--n,然后将剩下的堆重新和他的子节点排序,形成一个新的大堆
swap(ch[0], ch[--n]);
heapx(ch, 0,n);
}
for (int i = 0; i < nn; i++) {
cout << ch[i] << ' ';
}
return 0;
}