堆排序是源于树的,在此之前,我们要理解堆,堆相当与森林(许多树),且堆必为完全树
#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; }