Pagini recente » Cod sursa (job #2669493) | Cod sursa (job #2052256) | Cod sursa (job #2850825) | Cod sursa (job #56419) | Cod sursa (job #1311332)
#include <iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 500001
#define maxli 1000
#define M 2147483647
long int vi[maxn], vf[maxn], n;
long int li, le, in[maxli];
void reface_minim(int poz)
{
for (int i=poz*le; i<(poz+1)*le && i<n; i++)
if (in[poz]>vi[i]) in[poz]=vi[i];
}
void cauta_element(int x, int poz)
{
in[poz]=M;
int ok=1;
for (int i=poz*le; i<(poz+1)*le && i<n; i++)
if (vi[i]==x && ok) {
ok=0;
vi[i]=-1;
}
else if (in[poz]>vi[i] && vi[i]>=0) in[poz]=vi[i];
}
int cauta_minim()
{
int i, minim=M, indmin=li;
for (i=0;i<li;i++)
if (in[i]<minim && in[i]>=0) {minim=in[i]; indmin=i;}
cauta_element(minim, indmin);
return minim;
}
int main()
{
ifstream f("algsort.in");
ofstream g("algsort.out");
int i;
f>>n;
le=sqrt(n)+1;
li=le+!!(n-le*le);
for (i=0;i<n;i++) f>>vi[i];
for (i=0;i<maxli;i++) in[i]=M;
for (i=0;i<n;i++) if (in[i/le]>vi[i]) in[i/le]=vi[i];
for(i=0;i<n;i++) vf[i]=cauta_minim();
for (i=0;i<n;i++) g<<vf[i]<<' ';
}