[模板]堆

来源:互联网 发布:背高中英语单词软件 编辑:程序博客网 时间:2024/04/29 07:09
#include <stdio.h>using namespace std;int h[100];int siftdown(int h[100],int n,int i){    bool done=0;    if (i*2>n) return 0;    do    {        i=i*2;        if (i+1<=n&&h[i+1]>h[i]) i++;        if (h[i/2]<h[i])        {            int t=h[i];            h[i]=h[i/2];            h[i/2]=t;        }        else done=1;    }    while (i*2<=n&&done==0);}int siftup(int h[100],int i){    bool done;    if (i==1) return 0;    do    {        done=0;        if (h[i]>h[i/2])        {            int t=h[i];            h[i]=h[i/2];            h[i/2]=t;        }        else done=1;        i=i/2;    }    while (i!=1&&done!=1);}int heapinsert(int h[100],int n,int x){    n++;    h[n]=x;    siftup(h,n);}int heapdelete(int h[100],int n,int i){    int x=h[i],y=h[n];    n--;    if (i==n+1) return 0;    h[i]=y;    if (y>=x) siftup(h,i);    else siftdown(h,n,i);}int heapdeletemax(int h[100],int n){    heapdelete(h,n,1);}int makeheap(int h[100],int n){    for (int i=n/2;i>=1;i--)        siftdown(h,n,i);}int main(){    int n;    scanf("%d",&n);    for (int i=1;i<=n;i++)        scanf("%d",&h[i]);    makeheap(h,n);    int o=n,j=0;    for (int i=1;i<=n;i++)    {        printf("%d ",h[1]);        heapdeletemax(h,o);        o--;     }}
2 0