Pagini recente » Cod sursa (job #932461) | Cod sursa (job #3327245) | Cod sursa (job #3327264) | Cod sursa (job #1572081) | Cod sursa (job #1788378)
#include <stdio.h>
#include <math.h>
int a[500010],b[1000],poz[1000],max[1000];
void batog(int n)
{FILE *g;
g=fopen("algsort.out","w+");
int i ,radical ,q ,j, n1, mult, delete, min;
radical = sqrt(n);
n1 = n / radical;
mult = -1;
//formarea vectorilor poz si min
for(i = 1;i <= radical; ++i)
{ mult++;
max[mult+1] = 2147483647 ;
for(j = 1; j <= n1; ++j)
if(a[mult * n1 + j] < max[mult+1])
{max[mult+1] = a[mult * n1 + j];
poz[mult+1] = mult * n1 + j;
}
}
mult++;
max[radical+1] = 2147483647; //formarea grupei rest
for(i = 1;i <= n%radical; ++i)
{
if(a[mult * n1 + i] < max[mult+1])
{max[mult+1] = a[mult * n1 + i];
poz[radical + 1] = mult * n1 + i;}
}
if(n%radical!=0)
++radical; //modificarea numarului de grupe
//gasirea minimurilor
for(i = 1; i <= n; ++i)
{min=2147483647;
for(j = 1; j <= radical; ++j)
if(max[j] < min)
{
min=max[j];
delete=poz[j];
}
fprintf(g,"%d ",a[delete]);
a[delete]=-1;//inlocuirea valorii extrase
mult=delete / n1; //grupa din care face parte
if(delete % n1 == 0)
--mult;
max[mult+1]=2147483647;
for(j = 1;((j <= n1) && (mult * n1 + j<=n)) ; ++j)
{if((a[mult*n1+j] < max[mult+1]) && (a[mult*n1+j]!=(-1)))
{max[mult+1] = a[mult * n1 + j];
poz[mult+1] = mult * n1 + j;}
}
}
}
int main()
{
int n,i;
FILE *f;
f=fopen("algsort.in","r");
fscanf(f,"%d",&n);
for(i = 1;i <= n; ++i)
fscanf(f,"%d",&a[i]);
batog(n);
}