#include<bits/stdc++.h>
using namespace std;
#define swap1(a,b) do{int c=a, a =b, b =c}while(0)
//将k为根的子树调整为大根堆
void HeadAdjust(int a[], int k, int len) {
a[0] = a[k];//a[0] 是暂存位
for (int i = 2 * k; i <= len; i *= 2) {//i *=2 是把i变成他的左孩子下面判断若i>len则说明没有左孩子
if (i < len && a[i] < a[i + 1]) i++;//若左孩子<右孩子则指向右孩子,否则指的是左孩子,选最大的孩子向下筛选
if (a[0] >= a[i]) break;//结点小于根则不管
else {
a[k] = a[i]; k = i;//找到比根大的节点 放到根上,并且重置‘指针’
}
}
a[k] = a[0];
}
void BuildMaxHeap(int a[], int len) {
for (int i = len / 2; i > 0; i--)
HeadAdjust(a, i, len);
}
void HeapSort(int a[], int len) {
BuildMaxHeap(a, len);
for (int i = len; i > 1; i--) {
swap(a[i], a[1]);
HeadAdjust(a, 1, i - 1);
}
}
int main() {
int a[] = { 0,5,9,8,6,4,3,1,7,4 };
HeapSort(a, 9);
for (int i = 1; i < 10; i++) {//a[0]是暂存位
cout << a[i] << " ";
}
}