Pagini recente » Cod sursa (job #2787776) | Istoria paginii utilizator/ionutciobica | Cod sursa (job #2024633) | Cod sursa (job #849087) | Cod sursa (job #2055969)
#include <bits/stdc++.h>
#define NRMARE INT_MAX
using namespace std;
vector<int> v;
int n,Mini,Min[1000],l[1000],k,dif,lungime,radical;
ifstream f("algsort.in");
ofstream g("algsort.out");
void imparte_siruri()
{
radical=sqrt(n);
if(n<radical*(radical+1))
{
dif=n-radical*radical;
lungime=radical;
}
else dif=n-radical*(radical+1),lungime=radical+1;
Mini=NRMARE;
int i,j,t=0;l[0]=0;
for(i=0; i<dif; ++i)
{
Min[i]=NRMARE;
for(j=0; j<lungime+1; ++j)
if(Min[i]>v[t++])
{
Min[i]=v[t-1];
if(Mini>Min[i])
{
Mini=Min[i];
k=i;
}
}
l[i+1]=l[i]+lungime+1;
}
for(i=dif; i<radical; ++i)
{
Min[i]=NRMARE;
for(j=0; j<lungime; ++j)
if(Min[i]>v[t++])
{
Min[i]=v[t-1];
if(Mini>Min[i])
{
Mini=Min[i];
k=i;
}
}
l[i+1]=l[i]+lungime;
}
l[radical]=n;
}
void smen_batog()
{
imparte_siruri();int t,ok;
for(int j=0; j<n; ++j)
{
g<<Mini<<' ';
Min[k]=NRMARE;
int ok2=1;
for(int i=l[k]; i<l[k+1]; ++i)
{
if(ok2 && v[i]==Mini) v[i]=NRMARE,ok2=0;
if(Min[k]>v[i]) Min[k]=v[i];
}
Mini=NRMARE;
for(int i=0; i<radical; ++i)
if(Mini>Min[i])
Mini=Min[i],k=i;
}
}
int main()
{
int i;
f>>n;
v.resize(n);
for(i=0; i<n; ++i)
f>>v[i];
smen_batog();
return 0;
}