Cod sursa(job #3133026)

Utilizator zzzzzZazaazaza zzzzz Data 24 mai 2023 21:26:40
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#pragma GCC optimize("O2")

#include <iostream>
#include <fstream>
#include <cstring>

std::ifstream in(static_cast<const char*>("algsort.in"));
std::ofstream out(static_cast<const char*>("algsort.out"));

constexpr std::size_t nmax = 500003;

std::size_t n, v[nmax], t[nmax];

static inline std::size_t partition(const std::size_t& s, const std::size_t& d) {
    const int pz = s + (rand() % (d - s + 1));
    const std::size_t& pivot = v[pz];
    std::size_t k = 0, p = pz;
    for(std::size_t i = s; i <= d; ++i) {
        if(i == pz) continue;
        if(v[i] < pivot) t[++k] = v[i];
    }
    t[++k] = pivot; p = s + k - 1;
    for(std::size_t i = s; i <= d; ++i) {
        if(i == pz) continue;
        if(v[i] >= pivot) t[++k] = v[i];
    }
    std::memcpy(static_cast<void*>(v + s), static_cast<void*>(t + 1), k * sizeof(std::size_t));
    return p;
}

static inline void sort(const std::size_t& s, const std::size_t& d) {
    if(s >= d) return;

    const std::size_t p = partition(s, d);
    sort(s, p - 1);
    sort(p + 1, d);
}

int main(void) {
    std::ios::sync_with_stdio(false);
    in.tie(nullptr);
    out.tie(nullptr);

    in >> n;
    for(std::size_t i = 1; i <= n; ++i) in >> v[i];
    sort(1, n);
    for(std::size_t i = 1; i <= n; ++i) out << v[i] << ' ';

    in.close();
    out.close();
    return 0;
}