Pagini recente » Cod sursa (job #875448) | Cod sursa (job #598499) | Cod sursa (job #2081283) | Cod sursa (job #2084289) | Cod sursa (job #1249427)
#include <fstream>
#include <queue>
using namespace std;
const int NMax = 10000010;
const int radix = 8;
const int base = (1<<radix);
int N, A, B, C;
int v[NMax];
queue <int> Q[2][base];
void Read()
{
ifstream f("radixsort.in");
f >> N >> A >> B >> C;
f.close();
v[1] = B;
for (int i = 2; i <= N; ++ i)
v[i] = (1LL * A * v[i - 1] + 1LL * B) % C;
}
int RadixSort()
{
const int b = base - 1;
for (int i = 1; i <= N; ++ i)
Q[0][v[i] & b].push(v[i]);
int nrpasi = 32 / radix + ((32 % radix != 0) ? 1 : 0);
int p = 0;
for (int pas = 1; pas < nrpasi; ++ pas, p = 1 - p)
{
for (int rest = 0; rest < base; ++ rest)
while (!Q[p][rest].empty())
{
int x = Q[p][rest].front(); Q[p][rest].pop();
Q[1 - p][(x >> (pas * radix)) & b].push(x);
}
}
return p;
}
void Write(const int p)
{
ofstream g ("radixsort.out");
int nr = 0;
for (int rest = 0; rest < base; ++ rest)
{
while (!Q[p][rest].empty())
{
++ nr;
if (nr % 10 == 1)
g << Q[p][rest].front() << " ";
Q[p][rest].pop();
}
}
g << "\n";
g.close();
}
int main()
{
Read();
int p = RadixSort();
Write(p);
return 0;
}