Pagini recente » Cod sursa (job #1854300) | Cod sursa (job #1517945) | Cod sursa (job #2068120) | Cod sursa (job #1843744) | Cod sursa (job #1769591)
#include <iostream>
#include <fstream>
#include <string.h>
#define RADIX_SIZE 8
#define TOTAL_BYTES sizeof(int)
#define get_byte(x) ((x>>(byte * 8))&0xFF)
using namespace std;
int n , a, b , c;
unsigned int v [10000001];
void countsort(unsigned int * A,unsigned int * B, int byte)
{
++B;
int counter[1<<RADIX_SIZE];
int total, aux;
memset(counter, 0, sizeof(counter));
for(int i=1;i<=n;++i)
++counter[get_byte(A[i])];
total=0;
for(int i=0;i<1<<RADIX_SIZE;++i)
{
aux = counter[i];
counter[i] = total;
total += aux;
}
for(int i = 1; i <= n; ++i)
{
B[counter[get_byte(A[i])]] = A[i];
counter[get_byte(A[i])]++;
}
}
int main ()
{
ifstream in ("radixsort.in");
ofstream out ("radixsort.out");
in>> n >> a >> b >> c;
v[1]=b;
for(int i=2;i<=n;++i)
{
v[i] = (a * v[i-1] + b) % c; //generam
// cout<<v[i]<<" ";
}
unsigned int * secarray = new unsigned int [n+1];
for (unsigned int i = 0; i < TOTAL_BYTES; i ++)
{
if(i % 2 == 0)
countsort(v, secarray, i);// sortez dupa byteul i
else
countsort(secarray, v, i); //pun din primu in al 2-lea si din al 2-lea in primu pt a economisi spatiu
}
//cout<<"DWAAAAAAAAAAAAAA";
for(int i = 1; i <= n;i+=10)
out << v[i]<<" ";
in.close();
out.close();
return 0;
}