Cod sursa(job #2275790)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 3 noiembrie 2018 16:44:29
Problema Radix Sort Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 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;

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

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; 
	/*
	unsigned int nbits = 0; 
	while(max) { 
        nbits ++; 
        max >>= 1; 
    } 
	*/

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


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

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