Cod sursa(job #1314189)

Utilizator eneandradaEne Oana-Andrada eneandrada Data 11 ianuarie 2015 16:54:38
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");


int N,pozitie[710];
unsigned int v[500005],minim[710];
int main()
{
    f>>N;
    int i,j,poz,p,nrb=0;
    unsigned int mn;
    int rad=sqrt(1.0*N);
    for(i=1;i<=N;i++)
        f>>v[i];
    for(i=1;i<=rad*rad;i=i+rad)
    {
        mn=v[i];
        for(j=i;j<i+rad;j++)
            if(v[j]<=mn)
                {mn=v[j]; poz=j;}
        minim[++nrb] = mn;
        pozitie[nrb] = poz;
    }
    if(rad*rad!=N)
    {
        mn=v[rad*rad+1];
            for(i=rad*rad+1;i<=N;i++)
                if(v[i]<=mn)
                    {mn=v[i]; poz=i;}
        minim[++nrb]=mn;
        pozitie[nrb]=poz;
    }
    for(i=1;i<=N;i++)
    {
        mn=minim[1]; poz=1;
        for(j=1;j<=nrb;j++)
            if(minim[j]<=mn)
                mn=minim[j], poz=j;
        g<<mn<<" ";
        mn=v[pozitie[poz]]=2147483648U; //2^31
        if(poz<=rad)
        {
            for(j=rad*(poz-1)+1;j<=rad*poz;j++)
                if(v[j]<=mn)
                    {mn=v[j]; p=j;} //pozitia
        }
        else //in ultima bucata
        {
             for(j=rad*rad+1;j<=N;j++)
                if(v[j]<=mn)
                    {mn=v[j]; p=j;} //pozitia
        }
        minim[poz]=mn; pozitie[poz]=p; //actualizam bucata poz
    }
    f.close(); g.close();
    return 0;
}