Cod sursa(job #2055969)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 3 noiembrie 2017 22:59:00
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <bits/stdc++.h>
#define NRMARE INT_MAX
using namespace std;
vector<int> v;
int n,Mini,Min[1000],l[1000],k,dif,lungime,radical;
ifstream f("algsort.in");
ofstream g("algsort.out");
void imparte_siruri()
{
    radical=sqrt(n);
    if(n<radical*(radical+1))
    {
        dif=n-radical*radical;
        lungime=radical;
    }
    else dif=n-radical*(radical+1),lungime=radical+1;
    Mini=NRMARE;
    int i,j,t=0;l[0]=0;
    for(i=0; i<dif; ++i)
    {
        Min[i]=NRMARE;
        for(j=0; j<lungime+1; ++j)
            if(Min[i]>v[t++])
            {
                Min[i]=v[t-1];
                if(Mini>Min[i])
                {
                    Mini=Min[i];
                    k=i;
                }
            }
        l[i+1]=l[i]+lungime+1;
    }
    for(i=dif; i<radical; ++i)
    {
        Min[i]=NRMARE;
        for(j=0; j<lungime; ++j)
            if(Min[i]>v[t++])
            {
                Min[i]=v[t-1];
                if(Mini>Min[i])
                {
                    Mini=Min[i];
                    k=i;
                }
            }
        l[i+1]=l[i]+lungime;
    }
    l[radical]=n;
}
void smen_batog()
{
    imparte_siruri();int t,ok;
    for(int j=0; j<n; ++j)
    {
        g<<Mini<<' ';
        Min[k]=NRMARE;
        int ok2=1;
        for(int i=l[k]; i<l[k+1]; ++i)
        {
            if(ok2 && v[i]==Mini) v[i]=NRMARE,ok2=0;
            if(Min[k]>v[i]) Min[k]=v[i];
        }
        Mini=NRMARE;
        for(int i=0; i<radical; ++i)
            if(Mini>Min[i])
                Mini=Min[i],k=i;
    }
}
int main()
{
    int i;
    f>>n;
    v.resize(n);
    for(i=0; i<n; ++i)
        f>>v[i];
    smen_batog();
    return 0;
}