Cod sursa(job #2275699)

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

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

void radixsort(vector<int> & a,int n,int nbits){
	
	queue<int> *Q[2], *QP[2]; // cele 4 cozi (2 curente, 2 vechi) 
	queue<int> A,B,C,D;

	Q[0]=&A; Q[1]=&B;
	QP[0]=&C; QP[1]=&D;

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

	int elem,bit;
	for(int i=0;i<nbits;i++){ // intregi reprezentati pe 16 biti 
		for(int j=0;j<2;j++){	// parcurgerea celor 2 cozi	
			while(!Q[j]->empty()){ 
				elem=Q[j]->front(); 
				Q[j]->pop();
				bit=(elem>>i)%2;
				QP[bit]->push(elem); // inserare elem
			}
		}

		queue<int> *q0=Q[0], *q1=Q[1]; 
		Q[0]=QP[0];Q[1]=QP[1];
		QP[0]=q0; QP[1]=q1;
	}
	
	int i=0;	
	for(int j=0;j<2;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());
	radixsort(V,N,nbits);


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

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