Pagini recente » Cod sursa (job #102663) | Cod sursa (job #511513) | Cod sursa (job #1070737) | Cod sursa (job #1019064) | Cod sursa (job #1718457)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 10000001
typedef struct node
{
unsigned int key;
struct node *next;
} NodeT;
NodeT* enqueue(NodeT *root, unsigned int key)
{
if(root == NULL)
{
root = (NodeT*) malloc(sizeof(NodeT));
root->key = key;
root->next = NULL;
return root;
}
else
if(key < root->key)
{
NodeT *p = (NodeT*) malloc(sizeof(NodeT));
p->key = key;
p->next = root;
root = p;
return root;
}
else root->next = enqueue(root->next, key);
return root;
}
int main()
{
FILE *fin, *fout;
unsigned int N, A, B, C;
int i, j, k;
unsigned int* v;
unsigned char X;
NodeT *buckets[256], *p, *pa;
fin = fopen("radixsort.in", "r");
fout = fopen("radixsort.out", "w");
fscanf(fin, "%u %u %u %u", &N, &A, &B, &C);
v = (unsigned int*) malloc(sizeof(unsigned int) * (N+1));
v[1] = B;
for(i=2; i<=N; i++)
v[i] = (1LL * A * v[i-1] + B) % C;
memset(buckets, 0, sizeof(buckets));
//buckets[2] = enqueue(buckets[2], 2); exemplu
for(i=0; i<4; i++)
{
for(j=1; j<=N; j++)
{
X = (v[j] >> (8*i)) & 0xFF;
buckets[X] = enqueue(buckets[X], v[j]);
}
k = 1;
for(j=0; j<256; j++)
{
p = buckets[j];
while(p)
{
pa = p;
v[k] = p->key;
p = p->next;
free(pa);
k++;
}
buckets[j] = NULL;
}
}
for(i=1; i<=N; i+=10)
fprintf(fout, "%u ", v[i]);
putc('\n', fout);
fclose(fin);
fclose(fout);
free(v);
return 0;
}