#include <stdio.h>
//辅助函数
void dis(int arr[], int len){
int i = 0;
for(; i < len; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
//辅助函数
void swap(int* a, int* b)
{
int temp = *b;
*b = *a;
*a = temp;
}
// 维护堆:找到当前节点和孩子节点中的最大者,并递归维护调整后的子节点
// 数据数组
// 数组长度
// 维护的节点
void heapify(int arr[], int n, int i){
int father = i;
int lson = 2*i + 1;
int rson = 2*i + 2;
// 找最大节点
if(lson < n && arr[lson] > arr[father]){
father = lson;
}
if(rson < n && arr[rson] > arr[father]){
father = rson;
}
// 交换并递归维护
if(father != i){
swap(&arr[father], &arr[i]);
heapify(arr, n, father);
}
}
// 排序入口
void heapSort(int arr[], int n){
// 建堆:从n/2-1开始,从最后一个有孩子的节点开始
// 复杂度O(n)
int i;
for (i = n/2 - 1; i >= 0; i --) {
heapify(arr, n, i);
}
// 排序:第一个和最后一个交换并调整堆
for (i = n-1; i > 0; i --) {
swap(&arr[0], &arr[i]);
heapify(arr, i, 0);
}
}
//主函数
int main () {
int arr[] = {9,5,2,7,12,4,3,1,11};
int len = 9;
dis(arr, len);
heapSort(arr, len);
dis(arr, len);
return 0;
}