Pagini recente » Cod sursa (job #446238) | Cod sursa (job #2698569) | Cod sursa (job #117771) | Cod sursa (job #1961347) | Cod sursa (job #2275790)
#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;
}