堆排序是源于树的,在此之前,我们要理解堆,堆相当与森林(许多树),且堆必为完全树
#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+5;//n的最大长度
int a[maxn],len;
int main(){
int n,k;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
k=i;//定义k为当前最大深度
while(k>1/*k的位置不为根*/&&a[k]<a[k/2]/*当前节点小于它的父亲节点*/){
int tmp=a[k];//交换
a[k]=a[k/2];
a[k/2]=tmp;
k/=2;//将a[k]上浮一层
}
}
len=n;
for(int i=1;i<n;i++){
printf("%d ",a[1]);//持续输入根节点所在的数
a[1]=a[len--];//根节点所代表的树删去,替换成a串的最后一个
k=1;//k的位置为根节点
while((k*2<=len&&a[k]>a[k*2])||(k*2+1<=len&&a[k]>a[k*2+1])){//进行根节点此时代表数下浮
int u=k*2;//假定u为左孩子
if(u+1<=len&&a[u]>a[u+1])//看左孩子是否小于右孩子
u++;//换为右孩子
int tmp=a[k];//进行交换
a[k]=a[u];
a[u]=tmp;
k=u;//更新k值
}
}
cout<<a[len];//输出串的最后一个
return 0;
}