Cod sursa(job #2724448)

Utilizator om6gaLungu Adrian om6ga Data 17 martie 2021 06:46:04
Problema Radix Sort Scor 0
Compilator c-32 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

unsigned int byte[] = {0xff, 0xff00, 0xff0000, 0xff000000};

void pass(int pass_nr, unsigned int *array, unsigned int *out, int N, int A, int B, int C) {
	unsigned long long int vi;
    int count[255], index[255], i, j, sum;
    
    memset(count, 0, 255*sizeof(int));
    memset(count, 0, 255*sizeof(int));
    
    vi = B;
	for (i = 0; i < N; i++) {
		if (i) {
		    vi = (A * vi + B) % C;
	    }
	    count[vi & byte[pass_nr]]++;
	    if (pass_nr == 0) {
	    	array[i] = vi;
		}
	}
	
	sum = 0;
	for (i = 0; i < 255; i++) {
		sum += count[i];
		count[i] = sum;
	}
	for (i = 0; i < 255; i++) {
		index[i] = count[i] - 1;
	}
	
	for (i = N - 1; i >= 0; i--) {
	    out[index[array[i] & byte[pass_nr]]] = array[i];
	    index[array[i] & byte[pass_nr]]--;
	}
}

int main() {
    FILE *in=fopen("radixsort.in","r");
    FILE *out=fopen("radixsort.out","w");
    int N, A, B, C, i, j;
	unsigned long long int vi;
    int count[255] = {0}, sum, index[255];
	
	fscanf(in,"%d %d %d %d",&N, &A, &B, &C);

	unsigned int *array_in  = malloc(N*sizeof(unsigned int));
	unsigned int *array_out = malloc(N*sizeof(unsigned int));
	
	pass(0, array_in, array_out, N, A, B, C);
	pass(1, array_out, array_in, N, A, B, C);
	pass(2, array_in, array_out, N, A, B, C);
	pass(3, array_out, array_in, N, A, B, C);
	
	for (i = 0; i < N; i += 10)
	    fprintf (out, "%d ", array_in[i]);

	fclose(in);
	fclose(out);
	
	return 0;
}