Pagini recente » Cod sursa (job #2638565) | Cod sursa (job #2720166) | Cod sursa (job #1013320) | Cod sursa (job #709496) | Cod sursa (job #2126180)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream f("radixsort.in" );
ofstream g("radixsort.out");
int N, cmax;
unsigned int v[10000001];
queue<unsigned int>* groupA;
queue<unsigned int>* groupB;
int NrCif(int x)
{
int ncif = 0;
while ( x ) {
x/=10;
ncif++;
}
return ncif;
}
inline int Cif(int x, int pos) {
for ( int i=1; i<pos; i++ )
x /= 10;
return x%10;
}
void GenerateArray()
{
int A, B, C;
f >> N >> A >> B >> C;
groupA = new queue<unsigned int>[10];
groupB = new queue<unsigned int>[10];
int last= B;
int cifra = Cif(last, 1);
groupA[cifra].push(last);
cmax = max(cmax, NrCif(last));
for ( int i=2; i<=N; i++ ) {
int number = (A * last + B) % C;
int cifra = Cif(number, 1);
groupA[cifra].push(number);
cmax = max(cmax, NrCif(number));
last = number;
}
}
void RadixSort(unsigned int v[], int N)
{
for ( int nPas=2; nPas<=cmax; nPas++ ) {
for ( int i=0; i<10; i++ )
{
while ( !groupA[i].empty() )
{
int x = groupA[i].front();
groupA[i].pop();
groupB[Cif(x, nPas)].push(x);
}
}
swap(groupA, groupB);
}
}
int main()
{
GenerateArray();
RadixSort(v, N);
for ( int i=0; i<10; i++ ) {
while ( !groupA[i].empty() ) {
v[++v[0]] = groupA[i].front();
groupA[i].pop();
}
while ( !groupB[i].empty() ) {
v[++v[0]] = groupB[i].front();
groupB[i].pop();
}
}
for ( int i=0; i*10+1<=N; i++ )
g << v[i*10+1] << ' ';
}