#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;constint N =1000000;int a[N];int n,cnt;voidup(int u){int v = u >>1;if(v && a[v]> a[u])swap(a[u], a[v]),up(v);}voiddw(int u){int v = u, t = u <<1;if(t <= cnt && a[t]< a[v]) v = t;if(t +1<= cnt && a[t +1]< a[v]) v = t +1;if(u != v)swap(a[u], a[v]),dw(v);}voidpush(int x){
a[++cnt]= x;up(cnt);}voidpop(){
a[1]= a[cnt--];dw(1);}intmain(){
cin >> n;for(int i =1, x; i <= n; i++){
cin >> x,push(x);//上浮建堆}for(int i =1; i <= n; i++){
cout << a[1],pop();}return0;}
手写堆下沉建堆
#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;constint N =1000000;int n, cnt;int a[N];voidup(int u){int v = u >>1;if(v && a[v]> a[u])swap(a[v], a[u]),up(v);}voiddw(int u){int v = u, t = u <<1;if(t <= cnt && a[t]< a[v]) v = t;if(t +1<= cnt && a[t +1]< a[v]) v = t +1;if(v != u)swap(a[v],a[u]),dw(v);}voidpush(int x){
a[++cnt]= x;up(cnt);}voidpop(){
a[1]= a[cnt--];dw(1);}intmain(){scanf("%d",&n);
cnt = n;for(int i =1, x; i <= n; i++){scanf("%d",&a[i]);}for(int i = n >>1; i; i--)dw(i);for(int i =1; i <= n; i++){printf("%d",a[1]),pop();}return0;}
STL堆应用
#include<iostream>#include<cstring>#include<algorithm>#include<queue>usingnamespace std;
priority_queue<int, vector<int>, greater<int>> q;intmain(){int n;scanf("%d",&n);for(int i =1, x; i <= n; i++)scanf("%d",&x), q.push(x);//建堆for(int i =1; i <= n; i++)printf("%d ", q.top()), q.pop();}