Cod sursa(job #2458998)

Utilizator andreioneaAndrei Onea andreionea Data 22 septembrie 2019 07:48:02
Problema Sortare prin comparare Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>

constexpr auto SMALL_SORT_THRESHOLD = 500;

void small_sort(std::vector<uint32_t>& v, uint32_t fst, uint32_t lst)
{
    // Make a heap, then use selection sort
    std::make_heap(&v[fst], &v[lst + 1], std::greater<uint32_t>());
    for (size_t i = fst + 2; i <= lst; ++i) {
        uint32_t bubble = v[i];
        uint32_t right = i;
        uint32_t left = right;
        while (v[--left] > bubble)
        {
            v[right--] = v[left];
        }
        v[right] = bubble;
    }
}

void qsort(std::vector<uint32_t>& v, uint32_t left, uint32_t right) {
    if (right <= left)
        return;
    if ((right - left + 1) <= SMALL_SORT_THRESHOLD) {
        small_sort(v, left, right);
        return;
    }
    const auto mid = (left+right)/2;
    const auto rnd = left + rand() % (right - left);
    std::swap(v[mid], v[rnd]);
    const auto pivot = v[mid];
    auto i1 = left;
    auto i2 = right;
    while (i1 < i2) {
        while((v[i1] < pivot)) ++i1;
        while((v[i2] > pivot))  --i2;
        std::swap(v[i1], v[i2]);
        ++i1;
        --i2;
    }
    qsort(v, left, i2);
    qsort(v, i2 + 1, right);
}

int main()
{
    std::srand(std::time(nullptr));
    std::ifstream fin("algsort.in");
    std::ofstream fout("algsort.out");
    std::vector<uint32_t> v;
    uint32_t n;
    fin >> n;
    v.reserve(n);
    for (uint32_t i = 0; i < n; ++i) {
        uint32_t x;
        fin >> x;
        v.push_back(x);
    }
    qsort(v, 0, v.size() - 1);
    for (const auto x : v) {
        fout << x << " ";
    }
    return 0;
}