堆排时从小到大是pus_small&del_stob;从大到小是pus_big&del_btos
pus函数操作基本原理是把当前点与之上的点比对,有不符合规律的交换;
del函数操作基本原理是删去堆顶的点,把最后一个节点放到堆顶进行交换比对操作,若把删去的堆顶存下来的话就是排序
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int n,siz;int x;int p,q;
int a[maxn];int hp[maxn];
void pus_small(int x);
void pus_big(int x);
int del_stob();
int del_btos();
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&x);
// pus_small(x);
pus_big(x);
}
for(int i=1;i<=n;i++){//堆排及输出
// p=del_stob();
p=del_btos();
printf("%d",p);
}
// for(int i=1;i<=n;i++){//建堆输出
// printf("%d",hp[i]);
// }
// cout<<hp[1]<<endl;//堆顶输出
return 0;
}
void pus_small(int x){//小根堆
siz++;
hp[siz]=x;
int now=siz;
while(now>1){
if(hp[now]<hp[now/2]){
swap(hp[now],hp[now/2]);
now/=2;
}//if
else break;
}//while
}//void
void pus_big(int x){//大根堆
siz++;
hp[siz]=x;
int now=siz;
while(now>1){
if(hp[now]>hp[now/2]){
swap(hp[now],hp[now/2]);
now/=2;
}//if
else break;
}//while
}//void
int del_stob()//小到大排序
{
int res=hp[1];
hp[1]=hp[siz];siz--;
int now=1;
while(2*now<=siz)
{
int tp=2*now;
if(tp<siz && hp[tp]>hp[tp+1]) tp=tp+1;//如果左节点<总节点,说明有右节点 //>
if(hp[now]>hp[tp])//>
{
swap(hp[now],hp[tp]);
now=tp;
}
else break;//当前节点比孩子都小,提前结束
}
return res;
}
int del_btos()//大到小排序
{
int res=hp[1];
hp[1]=hp[siz];siz--;
int now=1;
while(2*now<=siz)
{
int tp=2*now;
if(tp<siz && hp[tp]<hp[tp+1]) tp=tp+1;//如果左节点<总节点,说明有右节点 //<
if(hp[now]<hp[tp])//<
{
swap(hp[now],hp[tp]);
now=tp;
}
else break;//当前节点比孩子都小,提前结束
}
return res;
}
//好玄学的说