Cod sursa(job #1788378)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 25 octombrie 2016 22:28:22
Problema Sortare prin comparare Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 1.89 kb
#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);





}