Pagini recente » Cod sursa (job #1185027) | Cod sursa (job #1126960) | Cod sursa (job #2932357) | Cod sursa (job #1028896) | Cod sursa (job #2275676)
#include<stdio.h>
#include<stdlib.h>
#include<vector>
using namespace std;
typedef struct queue{
int size; // dimensiunea cozii
int* head; // adresa de inceput a vectorului
}queue;
void radixsort(vector<int> & a,int n,int nbits){
queue Q[2],QP[2]; // cele 4 cozi (2 curente, 2 vechi)
for(int i=0;i<2;i++){ // alocarea spatiului pentru cozi
Q[i].size=0; Q[i].head=(int*)malloc(n*sizeof(int));
QP[i].size=0; QP[i].head=(int*)malloc(n*sizeof(int));
}
for(int i=0;i<n;i++) // depunerea elementelor in prima coada
Q[0].head[i]=a[i];
Q[0].size=n;
for(int i=0;i<nbits;i++){ // intregi reprezentati pe 16 biti
for(int j=0;j<2;j++){ // parcurgerea celor 2 cozi
for(int k=0;k<Q[j].size;k++){
int elem=Q[j].head[k];
int bit=(elem>>i)%2;
int size=QP[bit].size; // dim. curenta
QP[bit].head[size]=elem; // inserare elem
QP[bit].size++; // actualizare dimensiune
}
}
int *q0=Q[0].head, *q1=Q[1].head; // interschimbare cozi
Q[0]=QP[0];Q[1]=QP[1]; QP[0].head=q0;QP[1].head=q1;
QP[0].size=0;QP[1].size=0; // golirea cozilor
}
int i=0;
for(int j=0;j<2;j++){ // copierea elementelor in vector
for(int k=0;k<Q[j].size;k++){
a[i]=Q[j].head[k];
i++;
}
}
free(Q[0].head);free(Q[1].head); // eliberarea celor 4 cozi folosite
free(QP[0].head);free(QP[1].head);
}
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;
}