Cod sursa(job #3160730)

Utilizator davidpalagniucDavid Palagniuc davidpalagniuc Data 24 octombrie 2023 23:19:51
Problema Radix Sort Scor 30
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>
#include <stdlib.h>
#define ull unsigned long long
void rsort(unsigned *v, ull n, unsigned s, unsigned **t) {
	ull it[2];
	it[0]=0;
	it[1]=0;
	for(ull i=0;i<n;++i) {
		ull p=((ull)(1))&(v[i]>>s);
		t[p][it[p]]=v[i];
		++it[p];
	}
	for(ull i=0;i<it[0];++i)
		v[i]=t[0][i];
	for(ull i=0;i<it[1];++i)
		v[it[0]+i]=t[1][i];
}
void rxsort(unsigned *v, ull n) {
	unsigned **t=malloc(2*sizeof(unsigned*));
	t[0]=malloc(n*sizeof(unsigned));
	t[1]=malloc(n*sizeof(unsigned));
	for(unsigned i=0;i<64;++i) {
		rsort(v,n,i,t);
	}
	free(t[0]);
	free(t[1]);
	free(t);
}
int main() {
	FILE *fin=fopen("radixsort.in","r");
	ull n;
	unsigned a,b,c;
	fscanf(fin,"%llu %u %u %u",&n,&a,&b,&c);
	fclose(fin);
	unsigned *v=malloc(n*sizeof(unsigned));
	*v=b;
	for(ull i=1;i<n;++i) v[i]=(a*v[i-1]+b)%c;
	rxsort(v,n);
	FILE *fout=fopen("radixsort.out","w");
	for(int i=0;i<n;i+=10) fprintf(fout,"%u ",v[i]);
	fclose(fout);
	free(v);
	return 0;
}