- 分享
堆排序( 手打堆 )
- 2024-8-19 12:24:39 @
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int a[N],b,n,cnt;
void up(int u){
if(u==1)return;
int v=u>>1;
if(a[u]<a[v]){
swap(a[u],a[v]);
up(v);
}
}
void down(int u){
if(u<<1 >cnt)return;
int v=u<<1;
if(v+1<=cnt)
v+=a[v+1]<a[v];
if(a[v]<a[u]){
swap(a[u],a[v]);
down(v);
}
}
int front(){return a[1];}
void pop(){
swap(a[1],a[cnt--]);
down(1);
}
void push(int x){
a[++cnt]=x;up(cnt);
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>b;
push(b);
}
for(int i=1;i<=n;i++){
cout<<front()<<' ';
pop();
}
return 0;
}
0 条评论
目前还没有评论...