Cod sursa(job #1485828)

Utilizator mike93Indricean Mihai mike93 Data 13 septembrie 2015 04:00:20
Problema Radix Sort Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 2.22 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define B 256

typedef struct vectorInt {
	int* data;
	int size;
	int capacity;
} vectInt;
typedef vectInt* vector;

vector vec_new(int initCap) {
	if(initCap < 10) {
		initCap = 10;
	}
	vector vect = (vector)malloc(sizeof(vectInt));
	vect->capacity = initCap;
	vect->size = 0;
	vect->data = (int*)malloc(vect->capacity * sizeof(int));
	return vect;
}

void vec_free(vector vect) {
	free(vect->data);
	free(vect);
}

void vec_push_back(vector vect, int val) {
	if(vect->size == vect->capacity) {
		vect->capacity = 2 * vect->capacity;
		int* newData = (int*)malloc(vect->capacity * sizeof(int));
		memcpy(newData, vect->data, vect->size * sizeof(int));
		free(vect->data);
		vect->data = newData;
	}
	vect->data[vect->size] = val;
	vect->size = vect->size + 1;
}

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 t[10000000];
	int i;
	t[0] = b % c;
	long long x;
	for(i=1; i<n; i++) {
		x = (long long)a * (long long)t[i - 1] + (long long)b;
		t[i] = x % c;
		//printf("%d ", t[i]);
	}
	//printf("\n");
	int maxCifra = 0;
	while(c > 0) {
		maxCifra++;
		c = c / B;
	}
	int base = 1;
	vector bucket[B];
	for(i=0; i<maxCifra; i++) {
		int j;
		int buckSize[B];
		for(j=0; j<B; j++) {
			buckSize[j] = 0;
		}
		for(j=0; j<n; j++) {
			int cifra = (t[j] / base) % B;
			buckSize[cifra]++;
		}
		for(j=0; j<B; j++) {
			bucket[j] = vec_new(buckSize[j]);
		}
		for(j=0; j<n; j++) {
			int cifra = (t[j] / base) % B;
			vec_push_back(bucket[cifra], t[j]);
		}
		int h = 0;
		int k;
		for(j=0; j<B; j++) {
			//printf("%d:", j);
			for(k=0; k<(bucket[j]->size); k++) {
				t[h] = bucket[j]->data[k];
				//printf("%d ", t[h]);
				h++;
			}
			//printf("\n");
		}
		
		for(j=0; j<B; j++) {
			vec_free(bucket[j]);
		}
		base = base * B;
	}
	/*for(i=0; i<n; i++) {
		printf("%d ", t[i]);
	}
	printf("\n");*/
	FILE* fout = fopen("radixsort.out", "w");
	for(i=0; i<n; i+=10) {
		fprintf(fout, "%d ", t[i]);
	}
	fprintf(fout, "\n");
	
	fclose(fout);
	free(t);
	return 0;
}