Cod sursa(job #2542129)

Utilizator KPP17Popescu Paul KPP17 Data 9 februarie 2020 15:41:11
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.41 kb
using namespace std;



#define fisier "algsort"

#ifdef fisier
    #include <fstream>
    ifstream in(fisier ".in");
    ofstream out(fisier ".out");
#else
    #include <iostream>
    #define in cin
    #define out cout
#endif



const int MAX_N = 500000;

int v[MAX_N], n;



void v_copy(int *a, int *b, int n) {

    while (n--) {

        a[n] = b[n];

    }

}



void v_read(int* v, int& n) {

    in >> n;

    for (int i = 0; i < n; i++) {

        in >> v[i];

    }

}



void v_print(int* v, int n) {

    for (int i = 0; i < n; i++) {

        out << v[i] << ' ';

    }

    out << '\n';

}



inline void podea(int& s, int val) {if (val < s) s = val;}
inline void tavan(int& s, int val) {if (val > s) s = val;}



int* interclaseaza(int *a, int n, int *b, int m) {

    static int t[MAX_N];

    int i = 0, j = 0, k = 0;

    while (i < n && j < m) {

        if (a[i] < b[j]) {

            t[k++] = a[i++];

        } else {

            t[k++] = b[j++];

        }

    }

    while (i < n) {

        t[k++] = a[i++];

    }

    while (j < m) {

        t[k++] = b[j++];

    }

    return t;

}



void mergesort(int* st, int* dr) {

    if (st < dr) {

        int* m = st + (dr - st) / 2;

        mergesort(st, m);
        mergesort(m + 1, dr);

        v_copy(st, interclaseaza(st, m - st + 1, m + 1, dr - m), dr - st + 1);

    }

}



int* v_min(int* st, int* dr) {

    int* rt = st;

    while (++st <= dr) {

        if (*st < *rt)
            rt = st;

    }

    return rt;

}



int* v_max(int* st, int* dr) {

    int* rt = st;

    while (++st <= dr) {

        if (*st > *rt)
            rt = st;

    }

    return rt;

}



void frecvsort(int* st, int* dr, int _min, int _max) {

    static int frecv[MAX_N];
    int dif = _max - _min;

    for (int i = 0; i <= dif; i++) {

        frecv[i] = 0;

    }

    for (int* i = st; i <= dr; i++) {

        frecv[*i - _min]++;

    }

    for (int i = 0; i <= dif; i++) {

        while (frecv[i]--) {

            *(st++) = i + _min;

        }

    }

}



/*
void sortare_partitionata(int* st, int* dr) {

    for (int* part = MAX_N; part <= n; i += MAX_N) {



    }

}
*/



int main() {

    v_read(v, n);

    mergesort(v, v + n - 1);

    v_print(v, n);

}




//