Cod sursa(job #2275676)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 3 noiembrie 2018 13:30:46
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include<stdio.h>
#include<stdlib.h>

#include<vector>
using namespace std;

typedef struct queue{
	int size; // dimensiunea cozii
	int* head; // adresa de inceput a vectorului
}queue;


void radixsort(vector<int> & a,int n,int nbits){
	queue Q[2],QP[2]; // cele 4 cozi (2 curente, 2 vechi) 
	for(int i=0;i<2;i++){ // alocarea spatiului pentru cozi
		Q[i].size=0; Q[i].head=(int*)malloc(n*sizeof(int));
	    QP[i].size=0; QP[i].head=(int*)malloc(n*sizeof(int));
	}	

	for(int i=0;i<n;i++) // depunerea elementelor in prima coada
		Q[0].head[i]=a[i];
	Q[0].size=n;

	for(int i=0;i<nbits;i++){ // intregi reprezentati pe 16 biti 
		for(int j=0;j<2;j++){	// parcurgerea celor 2 cozi	
			for(int k=0;k<Q[j].size;k++){ 
				int elem=Q[j].head[k];
				int bit=(elem>>i)%2;
				int size=QP[bit].size; // dim. curenta
				QP[bit].head[size]=elem; // inserare elem
				QP[bit].size++; // actualizare dimensiune
			}
		}

		int	*q0=Q[0].head, *q1=Q[1].head; // interschimbare cozi
		Q[0]=QP[0];Q[1]=QP[1]; QP[0].head=q0;QP[1].head=q1;
		QP[0].size=0;QP[1].size=0; // golirea cozilor
	}
	
	int i=0;	
	for(int j=0;j<2;j++){ // copierea elementelor in vector	
		for(int k=0;k<Q[j].size;k++){
			a[i]=Q[j].head[k]; 
			i++;
		}
	}

	free(Q[0].head);free(Q[1].head); // eliberarea celor 4 cozi folosite 
	free(QP[0].head);free(QP[1].head);
}

int main(){
	long long A,B,C;
	int N;

	FILE* f= fopen("radixsort.in","rt");
	FILE* g= fopen("radixsort.out","wt");
	fscanf(f,"%d %lld %lld %lld",&N,&A,&B,&C);

	vector<int> V(N);
	V[0]=B;
	int max=B;

	long long rez;
	for(int i=1;i<N;i++){
		rez=(A * ((long long)V[i-1]))%C;
		rez=(rez+B)%C;
		V[i]=(int)rez;
		if(V[i]>max)
			max=V[i];
	}


	unsigned int nbits = 0; 
	while(max) { 
        nbits ++; 
        max >>= 1; 
    } 

	//sort(V.begin(),V.end());
	radixsort(V,N,nbits);


	for(int i=0;i<N;i+=10)
		fprintf(g,"%d ",V[i]);

	fclose(g);
	fclose(f);
	return 0;
}