Pagini recente » Cod sursa (job #1185414) | Cod sursa (job #884643) | Cod sursa (job #1050945) | Cod sursa (job #1539998) | Cod sursa (job #2275798)
#include<stdio.h>
#include<stdlib.h>
#include<vector>
#include<queue>
using namespace std;
#define bits 4
#define nbQueues 1<<bits
int V[10000000];
void radixsort(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(rounds==0)
rounds=1;
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);
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;
}