Cod sursa(job #1450424)

Utilizator NicusorTelescu Nicolae Nicusor Data 13 iunie 2015 12:43:57
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>

using namespace std;

int heap[500001];

void schimbare(int &a,int &b)
{
    int c=a;
    a=b;
    b=c;
}

void down_sift(int heap1[],int n,int k)
{
    int ok=1;
    while (ok)
    {
        int min=heap1[k],min1=k,i=k;
        if (i*2 <= n && heap1[i*2] > heap1[i])
        {
            min=heap1[i*2];
            min1=i*2;
        }
        if (i*2 + 1<=n && heap1[i*2+1] > heap1[i*2] && heap1[i*2 + 1] > heap1[i])
        {
            min=heap1[i*2+1];
            min1=i*2+1;
        }
        if (i*2 > n || min ==heap1[k])
            ok=0;
        else
        {
            schimbare(heap1[k],heap1[min1]);
            k=min1;
        }
    }
}

void sortare_heap(int heap1[],int n)
{
    for (int i=n/2;i>=1;i--)
    {
        down_sift(heap1,n,i);
    }
    for (int i=n;i>=2;i--)
    {
        schimbare(heap1[i],heap1[1]);
        down_sift(heap1,i-1,1);
    }
}

int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    int n;
    scanf("%d ",&n);
    for (int i=1;i<=n;i++)
        scanf("%d ",&heap[i]);
    sortare_heap(heap,n);
    for (int i=1;i<=n;i++)
        printf("%d ",heap[i]);
}