功能介绍:

min_heap p;//声明小根堆
p.len;//堆的大小
p.add(x);//将数据x插入堆中
p.del();//删除堆顶元素
p.top();//返回堆顶元素
p.print();//层序遍历顺序输出堆中元素
p.build(a,n);//将数组a[]的前n个元素建立小根堆( 时间复杂度:O(n) )
p.clear();//清空堆中元素
p.psort();//将p中元素从小到大输出,并删除堆中元素

代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 100052
struct min_heap{
    int data[maxn],len=0;
    void pushup(int x){
        if(x==1)return;
        int fa=x>>1;
        if(data[x]<data[fa]){
            int temp=data[x];
            data[x]=data[fa];
            data[fa]=temp;
            pushup(fa);
        }
        else return;
    }
    void pushdown(int x){
        int l=x<<1, r=x<<1|1;
        if(l>len || (data[x]<=data[l]&& data[x]<=data[r]) ) return;
        if(r>len || data[l]<data[r]){
            int temp=data[l];
            data[l]=data[x];
            data[x]=temp;
            pushdown(l);
        }
        else {
            int temp=data[r];
            data[r]=data[x];
            data[x]=temp;
            pushdown(r);
        }
    }
    void build(int *a, int n){//讲a数组建树
        len=n;
        for(int i=1;i<=n;i++){
            data[i]=a[i-1];
        }
        for(int i=len/2;i>0;i--){
            pushdown(i);
        }
    }
    void add(int val){//添加元素val
        len++;
        data[len]=val;
        pushup(val);
    }
    int top(){//返回堆顶元素
        return data[1] ;
    }
    void del(){//删除堆顶元素
        data[1]=data[len];
        len--;
        pushdown(1);
    }
    void print(){
        for(int i=1;i<=len;i++){
            printf("%d ",data[i]);
        }
        printf("\n");
    }
    void psort(){//将堆中元素从小到大输出
        while(len>0){
            printf("%d ",top());
            del();
        }
        printf("\n");
    }
    void clear(){
        len=0;
    }
};
int main(){
    min_heap p;
    p.clear();
    int n,a[1000];
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    p.build(a,n);
    p.psort();
    return 0;
}
/* 5 6 2 1 5 3 */