Pagini recente » Cod sursa (job #1338919) | Cod sursa (job #54800) | Cod sursa (job #798099) | Cod sursa (job #3148680) | Cod sursa (job #2613790)
#include<fstream>
#include<iostream>
#define MAX_N 10000000
#define BITS 8
#define MASK ((1 << BITS) - 1)
#define LIMIT 64
using namespace std;
int v[MAX_N];
void selectionSort(int left, int right) {
int k, i, j, aux;
for(i = left; i < right; ++i) {
k = i;
for(j = k + 1; j < right; ++j)
if(v[j] < v[k])
k = j;
aux = v[i];
v[i] = v[k];
v[k] = aux;
}
}
void radixSort(int left, int right, int bits) {
int Begin[1 << BITS], End[1 << BITS];
for(int i = 0; i < (1 << BITS); ++i)
End[i] = 0;
int val, nrList, aux, len;
for(int i = left; i < right; ++i)
++End[(v[i] >> bits) & MASK];
Begin[0] = left;
End[0] += left;
for(int i = 1; i < (1 << BITS); ++i) {
Begin[i] = End[i - 1];
End[i] += End[i - 1];
}
for(int i = 0; i < (1 << BITS); ++i) {
while(Begin[i] != End[i]) {
val = v[Begin[i]];
nrList = (val >> bits) & MASK;
while(nrList != i) {
aux = v[Begin[nrList]];
v[Begin[nrList]++] = val;
val = aux;
nrList = (val >> bits) & MASK;
}
v[Begin[i]++] = val;
}
}
if(bits) {
for(int i = 0; i < (1 << BITS); ++i) {
if(i)
len = End[i] - End[i - 1];
else len = End[i] - left;
if(len > LIMIT)
radixSort(End[i] - len, End[i], bits - BITS);
else if(len > 1)
selectionSort(End[i] - len, End[i]);
}
}
}
int main() {
int n, a, b, c;
ifstream fin("radixsort.in");
ofstream fout("radixsort.out");
fin >> n >> a >> b >> c;
v[0] = b;
for(int i = 1; i < n; ++i) {
v[i] = (1LL * a * v[i - 1] + b) % c;
}
radixSort(0, n, 24);
for(int i = 0; i < n; i += 10)
fout << v[i] << " ";
fout << "\n";
fin.close();
fout.close();
return 0;
}