Pagini recente » Cod sursa (job #100146) | Cod sursa (job #1625449) | Cod sursa (job #767008) | Cod sursa (job #624696) | Cod sursa (job #2051850)
#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;
}