Cod sursa(job #1259976)

Utilizator crucerucalinCalin-Cristian Cruceru crucerucalin Data 10 noiembrie 2014 19:18:40
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>



/**
 * HEAPSORT
 */
void sink(std::vector<int> &v, std::size_t k, std::size_t dim)
{
    while (2*k < dim) {
        auto son = 2 * k;
        if (son + 1 < v.size() && v[son] < v[son + 1])
            ++son;

        if (v[k] > v[son])
            break;

        std::swap(v[k], v[son]);
        k = son;
    }
}

void swim(std::vector<int> &v, std::size_t k)
{
    while (k > 1 && v[k] > v[k/2]) {
        std::swap(v[k], v[k/2]);
        k /= 2;
    }
}

void heapSort(std::vector<int> &v)
{
    for (auto i = v.size() / 2; i >= 1; --i)
        sink(v, i, v.size());

    for (auto it = v.end(); it != v.begin() + 1; --it) {
        std::swap(*it, v[1]);
        sink(v, 1, it - v.begin());
    }
}

void sort(std::vector<int> &v)
{
    heapSort(v);
}

int main()
{
    std::ifstream fin("algsort.in");
    std::ofstream fout("algsort.out");

    int N;
    fin >> N;

    std::vector<int> v(N + 1);
    for (auto it = v.begin() + 1; it != v.end(); ++it)
        fin >> *it;

    sort(v);
    for (auto &i : v)
        fout << i << " ";

    return 0;
}