// 下标为i的结点的父节点下标:(i-1)/2 (整除除法)
// 下标为i的结点的左孩子下标:i*2+1
// 下标为i的结点的右孩子下标:i*2+2
#include<iostream>
using namespace std;
//void heapify(int a[], int n, int i); // 堆维护
//void head_sort(int a[], int n);
//void swap(int& a, int& b);
void swap(int& x, int& y) {
int temp = x;
x = y;
y = temp;
}
void heapify(int a[], int n, int i) {
int dnode = i;
int lson = i * 2 + 1;
int rson = i * 2 + 2;
if (lson < n && a[dnode] < a[lson]) dnode = lson;
if (rson < n && a[dnode] < a[rson]) dnode = rson;
if (dnode != i) {
swap(a[dnode], a[i]);
heapify(a,n,dnode);
}
}
// 堆的入口
void head_sort(int a[], int n) {
// 建堆
for (int i = n / 2 - 1; i >= 0; i--) {
heapify(a, n, i);
}
// 排序
for (int i = n - 1; i > 0; i--) {
swap(a[i], a[0]);
heapify(a, i, 0);
}
}
int main() {
/*cout << "请输入你想元素的个数:";
cin >> n;
for (int i = 0; i < n; i++) {
cout << "情输入你想进行大顶堆排序的数组:" << endl;
cin >> a[i];
}*/
int a[] = { 2,4,3,5,7,9,8,6,1,0 };
int n = 10;
for (int i = 0; i < n; i++) {
cout << a[i] << ' ';
}
cout << endl;
head_sort(a, n);
for (int i = 0; i < n; i++) {
cout << a[i] << ' ';
}
return 0;
}