Pagini recente » Cod sursa (job #530625) | Cod sursa (job #763329) | Cod sursa (job #2575110) | Cod sursa (job #1555536) | Cod sursa (job #3139247)
#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 int *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 int *arr=(unsigned int *)calloc(n, sizeof(unsigned int));
arr[0]=B;
for(unsigned int i=1;i<n;i++) {
// fscanf(f, "%u", &arr[i]);
arr[i]=(arr[i-1]*A+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;
}