Cod sursa(job #1059625)

Utilizator NitaMihaitavoidcube NitaMihaita Data 16 decembrie 2013 20:26:04
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include<cmath>
#define numaru 5000000
#define nrmare (1<<30)-1
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int v[numaru],bb[2500][2],l,nrz,n;
void citeste()
{
    int i;
    f>>n;
    l=sqrt(n);
    nrz=n/l;
    if(n%l!=0)++nrz;
    for(i=0;i<nrz;++i) { bb[i][0]=nrmare; bb[i][1]=i*l; }
    for(i=0;i<n;++i)
    {
        f>>v[i];
        if(v[i]<bb[i/l][0])
        {
            bb[i/l][0]=v[i];
            bb[i/l][1]=i;
        }
    }
}
void verif()
{
    g<<"\n{\n"; for(int i=0;i<nrz;++i) g<<"  "<<bb[i][0]<<" "<<bb[i][1]<<"\n"; g<<"}\n";
}
void operatiunea_sortarea()
{
    int i,_min,_minpoz,j,ed;
    for(j=0;j<n;++j)
    {
        _min=nrmare;
        for(i=0;i<nrz;++i)
            if(_min>bb[i][0])
            {
                _min=bb[i][0];
                _minpoz=i;
            }
        g<<_min<<" ";
        v[bb[_minpoz][1]]=nrmare;
        bb[_minpoz][0]=nrmare;
        ed=(bb[_minpoz][1]/l+1)*l; if(n<ed) ed=n;
        for(i=bb[_minpoz][1]/l*l;i<ed;++i)
        {
            if(v[i]<bb[_minpoz][0])
            {
                bb[_minpoz][0]=v[i];
                bb[_minpoz][1]=i;
            }
        }
    }
}
int main()
{
    citeste();
    operatiunea_sortarea();
    f.close();
    g.close();
    return 0;
}