Cod sursa(job #2051850)

Utilizator biaiftimeIftime Bianca biaiftime Data 29 octombrie 2017 17:05:03
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <cmath>
#define Nmax 500002
#define Mmax 800
#define inf 1000000000
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int a[Nmax],n,rad;
int nrmin[Mmax],k;
struct pozitie
{
    int st,dr,loc;
}pozmin[Mmax];
void Read(int &n,int a[Nmax])
{
    int i;
    fin>>n;
    for(i=1;i<=n;i++)
    fin>>a[i];
}
void Min(int s,int d,int poz)
{
    int i;
    if(poz==k)d=n;
    nrmin[poz]=a[s];
    pozmin[poz].loc=s;
    for(i=s+1;i<=d;i++)
    if(a[i]<nrmin[poz]){ nrmin[poz]=a[i]; pozmin[poz].loc=i;}
}
void Secvente(int n,int a[Nmax])
{
    int i,j=1;
    rad=sqrt(n);
    if(n==rad*rad) k=rad;
    else k=rad+1;
    for(i=1;i<=k;i++)
    { Min(j,j+rad-1,i);pozmin[i].st=j; pozmin[i].dr=j+rad-1; j=j+rad;}
    pozmin[k].dr=n;
}
void Sortare()
{
    int i,minj,j,pozj;
    for(i=1;i<=n;i++)
    {
        minj=nrmin[1];
        pozj=1;
        for(j=2;j<=k;j++)
        if(nrmin[j]<minj){minj=nrmin[j];pozj=j; }
        fout<<minj<<" ";
        a[pozmin[pozj].loc]=inf;
        Min(pozmin[pozj].st,pozmin[pozj].dr,pozj);
    }
}
int main()
{
     Read(n,a);
     Secvente(n,a);
     Sortare();
    return 0;
}