Cod sursa(job #3139248)

Utilizator razviOKPopan Razvan Calin razviOK Data 26 iunie 2023 17:33:47
Problema Radix Sort Scor 30
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <stdio.h>
#include <stdlib.h>

unsigned int Maximum(unsigned int a,unsigned int b){
    return (a>b) ? a:b;
}
unsigned int MaximumDigits(unsigned int num){

    if(num==0) return 1;

    unsigned int size=0;
    while(num){
        size+=1;
        num/=10;
    }

    return size;
}
void RadixSort(unsigned long long *arr,unsigned int n,unsigned int maxIterations)
{
   unsigned int **bucket=(unsigned int **)calloc(10, sizeof(unsigned int *));
   unsigned int *bucketSize=(unsigned  int *)calloc(10, sizeof(unsigned int *));
   unsigned int div=1,cnt=0;

   for(unsigned int i=0;i<10;i++)
       bucket[i]=(unsigned int *)calloc(n, sizeof(unsigned int));

   for(unsigned int it=0;it<maxIterations;it++) {

       for (unsigned int i = 0; i < n; i++)
           bucket[(arr[i]/div)%10][bucketSize[(arr[i] / div) % 10]++] = arr[i];

       for (unsigned int i = 0; i < 10; i++){
           for (unsigned int j = 0; j < bucketSize[i]; j++)
               arr[cnt++]=bucket[i][j];
           bucketSize[i]=0;
   }

       div*=10;
       cnt=0;
   }

   for(unsigned int i=0;i<10;i++)
       free(bucket[i]);

   free(bucket);
    free(bucketSize);

}
int main() {

    FILE *f=fopen("radixsort.in","r");
    FILE *g=fopen("radixsort.out","w");

    if(NULL==f || NULL==g)
        exit(1);

    unsigned int n,A,B,C,maxIterations=0;
    fscanf(f,"%u %u %u %u",&n,&A,&B,&C);

    unsigned long long *arr=(unsigned long long *)calloc(n, sizeof(unsigned long long));

    A=A%C;
    B=B%C;
    arr[0]=B;
    for(unsigned int i=1;i<n;i++) {
       // fscanf(f, "%u", &arr[i]);
       arr[i]=((arr[i-1]%C*A)%C+B)%C;
       maxIterations= Maximum(maxIterations, MaximumDigits(arr[i]));
    }
    RadixSort(arr,n,maxIterations);

    for(unsigned int i=0;i<n;i+=10)
        fprintf(g,"%u ",arr[i]);

    fclose(f);
    fclose(g);
    free(arr);
    return 0;
}