Cod sursa(job #1040455)

Utilizator alexsuciuAlex Suciu alexsuciu Data 24 noiembrie 2013 15:42:40
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<iostream>
#include<cmath>
#include<fstream>
#define maxim 2147483649;
using namespace std;
unsigned long v[500001],a[500001][2],i,j,n,l,mini;
unsigned long k=0,nr,el,mini2,poz;

int main()
{
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    scanf("%lu",&n);
    for(i=0;i<n;i++)
        scanf("%lu",&v[i]);
    l=sqrt(n);
    mini=a[0][0]=v[0];
    a[0][1]=0;
    for(i=1;i<n;i++)
    {
        if(v[i]<mini && k>=(i/l)) {mini=a[i/l][0]=v[i]; a[i/l][1]=i;}
        if (k<(i/l))
        {k++;
        mini=v[i];
        a[i/l][0]=mini;
        a[i/l][1]=i;}
    }
    mini=maxim;
    if((float)n/l==n/l)
    while(nr<n)
    {for(i=0;i<n/l;i++)
   {
        if(a[i][0]<mini) {mini=a[i][0]; k=i;}
    }
    mini=maxim;
    printf("%lu",a[k][0]);
    v[a[k][1]]=a[k][0]=maxim;
    for(j=k*l;j<k*l+l;j++)
    {
        if(v[j]<mini) {mini=v[j]; a[k][0]=v[j]; a[k][1]=j;}
    }
    nr++;}
    else
    while(nr<n)
    {for(i=0;i<=n/l;i++)
   {
        if(a[i][0]<mini) {mini=a[i][0]; k=i;}
    }
    mini=maxim;
    printf("%lu ",a[k][0]);
    v[a[k][1]]=a[k][0]=maxim;
    for(j=k*l;j<k*l+l && j<n;j++)
    {
        if(v[j]<mini) {mini=v[j]; a[k][0]=v[j]; a[k][1]=j;}
    }
    nr++;}


}