Cod sursa(job #1315995)

Utilizator priestnoobFMI - Dan Nema priestnoob Data 13 ianuarie 2015 13:45:16
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;

#define nmax 500005

int n,l,v[nmax],batog[nmax],c;

void citire()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i) scanf("%d",&v[i]);
}

void solve()
{
    l=sqrt(n);
    while(c*l<n)
    {
        for(int i=c*l+1;i<=(c+1)*l;++i)
        if(batog[c+1]<v[i]) batog[c+1]=v[i];
        c++;
    }
    int x=0,m,a;
    for(int i=1;i<=n;++i)
    {
        m=0;
        for(int j=1;j<=c;++j)
            if(batog[j]>m)
            {
                m=batog[j];
                a=j;
            }
        for(int j=(a-1)*l+1;j<=a*l;++j)
        {
            if (v[j]==m)
            {
                swap(v[j],v[n-x]);
                x++;
                break;
            }
        }
        batog[a]=0;
        for(int j=(a-1)*l+1;j<=a*l;++j)
        {
            if(batog[a]<v[j]) batog[a]=v[j];
        }
        if(n-x<=(c-1)*l) c--;
       // for(int i=1;i<=n;++i) printf("%d ",v[i]);
       // printf("\n");
    }
    for(int i=1;i<=n;++i) printf("%d ",v[i]);
}

int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    citire();
    solve();
}