Cod sursa(job #1485973)

Utilizator mike93Indricean Mihai mike93 Data 13 septembrie 2015 14:48:31
Problema Radix Sort Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <stdlib.h>

#define B 256

int main() {
	FILE* fin = fopen("radixsort.in", "r");
	int n;
	int a, b, c;
	fscanf(fin, "%d %d %d %d\n", &n, &a, &b, &c);
	fclose(fin);
	
	int* t = (int*)malloc(n * sizeof(int));
	
	int i;
	t[0] = b % c;
	for(i=1; i<n; i++) {
		t[i] = (a * 1LL * t[i - 1] + b) % c;
	}
	int maxCifra = 0;
	while(c > 0) {
		maxCifra++;
		c = c / B;
	}
	long base = 1;
	int buckSize[B];
	int* temp = (int*)malloc(n * sizeof(int));
	int j;
	for(i=0; i<maxCifra; i++) {
		
		for(j=0; j<B; j++) {
			buckSize[j] = 0;
		}
		for(j=0; j<n; j++) {
			buckSize[(t[j] / base) % B]++;
		}
		buckSize[0]--;
		for(j=1; j<B; j++) {
			buckSize[j] = buckSize[j] + buckSize[j - 1];
		}
		for(j=n-1; j>=0; j--) {
			int cifra = (t[j] / base) % B;
			temp[buckSize[cifra]] = t[j];
			buckSize[cifra]--;
		}
		for(j=0; j<n; j++) {
			t[j] = temp[j];
		}
		base = base * B;
	}

	FILE* fout = fopen("radixsort.out", "w");
	/*for(i=0; i<n; i+=10) {
		fprintf(fout, "%d ", t[i]);
	}
	fprintf(fout, "\n");*/
	
	fclose(fout);
	//free(temp);
	//free(t);
	return 0;
}