Pagini recente » Cod sursa (job #987683) | Cod sursa (job #2373213) | Cod sursa (job #32759) | Cod sursa (job #1969110) | Cod sursa (job #2466054)
#include <fstream>
#include <cstring>
std::ifstream f("radixsort.in");
std::ofstream g("radixsort.out");
constexpr int countsize = 256;
constexpr int bucketsize = 8;
constexpr int mask = (1 << bucketsize) - 1;
constexpr int NMAX = 10000001;
int input[NMAX];
int temp[NMAX];
int position[countsize];
int frequence[countsize];
int computeposition(int val, int bucket)
{
return val >> (bucket * bucketsize) & mask;
}
void sort(int input[], int N)
{
int c, pos;
for (int bucket = 0; bucket < 4; ++bucket)
{
memset(frequence, 0, sizeof(frequence));
memset(position, 0, sizeof(position));
//compute frequencies
for(int i=0; i < N; ++i)
{
c = computeposition(input[i], bucket);
frequence[c]++;
}
//compute positions
int i, count = frequence[0];
for (i = 1; i < countsize; ++i)
{
if (frequence[i])
{
position[i] = count;
count += frequence[i];
}
}
//move elements
for(int i=0; i < N; ++i)
{
pos = computeposition(input[i], bucket);
frequence[pos] --;
temp[position[pos]] = input[i];
position[pos]++;
}
for(int i=0; i < N; ++i)
{
input[i] = temp[i];
}
}
}
int main()
{
int N;
int A, B, C;
f >> N >> A >> B >> C;
memset(input, 0, sizeof(input));
memset(temp, 0, sizeof(temp));
input[0] = B;
for (int i = 1; i < N; ++i)
{
input[i] = (1LL * A * input[i - 1] + B) % C;
}
sort(input, N);
for (int i = 0; i < N; i += 10)
{
g << input[i] << ' ';
}
return 0;
}