Fork me on GitHub

 

 

 

 

 

 

 

 

 

 

 

 

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1000010
using namespace std;
int n,a[N];
void up(int x)
{
    while(x>1)
    {
        int y=x/2;
        if(a[y]>a[x])
        {
            swap(a[x],a[y]);
            x=y;
        }
        else break;
    }
}
void down(int x)
{
    while(x*2<=n)
    {
        int y=x*2;
        if(x*2+1>n)
        {
            if(a[y]<a[x])
            {
                swap(a[x],a[y]);
                x=y;
            }
            else break;
        }
        else
        {
            int z=y+1;
            if(a[y]<a[z])
            {
                if(a[y]<a[x])
                {
                    swap(a[x],a[y]);
                    x=y;
                }
                else break;
            }
            else
            {
                if(a[z]<a[x])
                {
                    swap(a[x],a[z]);
                    x=z;
                }
                else break;
            }
        }
    }
}
void insert(int x)
{
    a[++n]=x;
    up(n);
}
void del(int x)
{
    a[x]=a[n];
    n--;
    if(x!=1&&a[x]<a[x/2]) up(x);
    else down(x);
}
void build()
{
    for(int i=n/2;i;i--) down(i);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    build();
    int m=n;
    for(int i=1;i<=m;i++)
    {
        int x=a[1];
        del(1);
        cout<<x<<' ';
    }
    cout<<endl;
}
posted @ 2020-01-18 20:43  liusu123456  阅读(100)  评论(0编辑  收藏  举报