Cod sursa(job #2275786)

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

#include<vector>
#include<queue>
using namespace std;

#define bits 8
#define nbQueues 1<<bits

void radixsort(vector<int> & a,int n,int maxbits){
	
	queue<int> *Q[nbQueues], *QP[nbQueues];
	queue<int> A[nbQueues],B[nbQueues];

	for(int i=0;i<nbQueues;i++){
		Q[i]=&A[i];
		QP[i]=&B[i];
	}

	int rounds=(maxbits+1)/bits;
	if(bits==1)
		rounds=maxbits;

	for(int i=0;i<n;i++) // depunerea elementelor in prima coada
		Q[0]->push(a[i]);

	int elem,coada;
	int mask=(1<<bits)-1;

	for(int i=0;i<rounds;i++){ // intregi reprezentati pe maxbits biti 
		for(int j=0;j<nbQueues;j++){	// parcurgerea celor nbQueues cozi	
			while(!Q[j]->empty()){ 
				elem=Q[j]->front(); 
				Q[j]->pop();
				
				coada=(elem>>(i*bits)) & mask;
				//bit=(elem>>i)%2;
				
				QP[coada]->push(elem); // inserare elem
			}
		}

		queue<int> *q[nbQueues];
		for(int j=0;j<nbQueues;j++){
			q[j]=Q[j];
			Q[j]=QP[j];
			QP[j]=q[j];
		}
	}
	
	int i=0;	
	for(int j=0;j<nbQueues;j++){ // copierea elementelor in vector	
		while(!Q[j]->empty()){
			a[i]=Q[j]->front();
			Q[j]->pop();
			i++;
		}
	}
}

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());
	nbits=16;
	radixsort(V,N,nbits);


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

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