Pagini recente » Cod sursa (job #2866467) | Cod sursa (job #3240952) | Cod sursa (job #80744) | Istoria paginii utilizator/xxmihaixx969 | Cod sursa (job #2275774)
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<queue>
using namespace std;
#define bits 4
#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=32;
radixsort(V,N,nbits);
for(int i=0;i<N;i+=10)
fprintf(g,"%d ",V[i]);
fclose(g);
fclose(f);
return 0;
}