#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; }