Pagini recente » Cod sursa (job #1625004) | Cod sursa (job #1311784) | Cod sursa (job #82534) | Cod sursa (job #2401315) | Cod sursa (job #2556268)
/**
radix sort: O( baza * n * log(baza, maximum) )
(maximum = c)
ne avantajeaza mai mult sa scadem din baza direct
decat sa marim baza ca sa scadem logaritmul
pentru ca logaritmul creste logaritmic
si baza creste linear
linear > logaritmic
hai sa setam baza la 2
ar trebui sa obtinem
O( 2*n*lb(maximum) )
adica O(64*n)
ceea ce ar trebui sa fie accentuat
de comfortul calculului cu 2 pe care il au procesoarele
acesta este un program general pentru baza putere de 2
incercare de optimizare cu referinte
**/
#define fisier "radixsort"
#ifdef consola
#include <iostream>
#define in std::cin
#define out std::cout
#else
#include <fstream>
#ifndef fisier
#define fisier "HYPER"
#endif
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
#endif
const int
MAX_N = 10000000, // 10 000 000
Z_ULTIMUL_BIT = 1 << 30,
BAZA_BINARA = 16,
BAZA = 1 << BAZA_BINARA;
// 00001111 << (8 - 4) == 11110000
inline int getCif(int& x, int& z, int& z_st_idx) {
return (x >> z_st_idx) & z;
}
void cifSort(int* v, int& n, int& z, int& z_st_idx) {
static int aux[MAX_N], frecv[BAZA];
for (int i = 0; i < n; i++) {
frecv[getCif(v[i], z, z_st_idx)] ++;
}
for (int cif = 1; cif < BAZA; cif++) {
frecv[cif] += frecv[cif - 1];
}
for (int i = n - 1; i >= 0; i--) {
aux[-- frecv[getCif(v[i], z, z_st_idx)]] = v[i];
}
for (int i = 0; i < n; i++) {
v[i] = aux[i];
}
for (int cif = 0; cif < BAZA; cif++) {
frecv[cif] = 0;
}
}
void radixSort(int* v, int& n) {
int z, z_st_idx;
for (z = BAZA - 1, z_st_idx = 0; !(z & Z_ULTIMUL_BIT); z <<= BAZA_BINARA, z_st_idx += BAZA_BINARA) {
//out << z << ' ';
cifSort(v, n, z, z_st_idx);
} //out << z << ' ';
z ^= 1 << 31;
//out << z << "\n";
cifSort(v, n, z, z_st_idx);
}
int v[MAX_N];
int main() {
int n, a, b, c;
in >> n >> a >> b >> c;
*v = b;
for (int i = 1; i < n; i++) {
v[i] = (1LL * a * v[i - 1] + b) % c;
}
radixSort(v, n);
for (int i = 0; i < n; i += 10) {
out << v[i] << ' ';
}
}
//