#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100010;
int heap[maxn],n;
void downAdjust(int low,int high){
int i=low,j=i*2; // i为欲调整的节点,j为其左子树
while(j<=high){ // 存在孩子节点
// 如果右孩子存在并且大于左孩子
if(j+1<=high&&heap[j+1]>heap[j])
j=j+1; // 让j存储右孩子下标
if(heap[j]>heap[i]){
swap(heap[j],heap[i]);
i=j;
j=i*2;
} else{
break;
}
}
}
void createHeap(){
for(int i=n/2;i>=1;i--){
downAdjust(i,n);
}
}
void heapSort(){
createHeap();
for(int i=n;i>1;i--){
swap(heap[i],heap[1]);
downAdjust(1,i-1);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&heap[i]);
}
heapSort();
for(int i=1;i<=n;i++)
printf("%d ",heap[i]);
return 0;
}
堆排序
最新推荐文章于 2023-09-21 13:21:58 发布