#include<iostream> #include<cstring> using namespace std; int arr[10010];//要排序的数据 int n;//一共有多少数据 void Max_heap(int arr[], int first, int last){ int par = first; int son = par * 2 + 1; while(son <= last){ if(son + 1 <= last && arr[son] < arr[son + 1]){ son++; } if(arr[par] > arr[son]){//如果满足,那么就直接返回 return; }else{ int temp = arr[par]; arr[par] = arr[son]; arr[son] = temp;//交换顺序 par = son; son = par * 2 + 1;//再次进入循环 } } } void heap_sort(int arr[], int len){ for(int i = len / 2 - 1;i >= 0;i--){ //从最后一个非叶子节点开始往回走 Max_heap(arr, i, len-1); }//先排好形成大顶堆 //下面代码:先将第一个元素和已经排好元素前一位作交换,再进行堆排序 for(int i = len - 1;i > 0;i--){ int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; Max_heap(arr, 0, i - 1); } } int main(){ cin>>n; for(int i = 0;i < n;i++){ cin>>arr[i]; } heap_sort(arr, n); for(int i = 0;i < n;i++){ cout<<arr[i]<<" "; }cout<<endl; return 0; }