Cod sursa(job #2556245)

Utilizator KPP17Popescu Paul KPP17 Data 24 februarie 2020 19:34:01
Problema Radix Sort Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
/**
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) >> z_st_idx;

}



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] << ' ';

    }

}






















//