Pagini recente » Cod sursa (job #817689) | Cod sursa (job #2497417) | Cod sursa (job #3139438) | Cod sursa (job #2555422) | Cod sursa (job #2275699)
#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;
}