Cod sursa(job #2775744)

Utilizator radu.z5Zamfirescu Radu Ioan radu.z5 Data 16 septembrie 2021 22:32:32
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;

#define parent(i) ((i - 1) >> 1)
#define left(i) ((i << 1) + 1)
#define right(i) ((i << 1) + 2)

void siftDown(int *v, size_t n, size_t idx) {
    size_t l, r, biggest;

    while (true) {
        l = left(idx);
        r = right(idx);
        biggest = idx;

        if (l < n && v[biggest] < v[l])
            biggest = l;
        if (r < n && v[biggest] < v[r])
            biggest = r;

        if (biggest == idx)
            break;

        swap(v[biggest], v[idx]);
        idx = biggest;
    }
}

void moveFirstBack(int *v, int n) {
    swap(v[0], v[n - 1]);
    n--;
    siftDown(v, n, 0);
}

void heapsort(int *v, int n) {
    int i;
    for (i = parent(n - 1); i >= 0; i--)
        siftDown(v, n, i);
    while (n > 0) {
        moveFirstBack(v, n);
        n--;
    }
}

int main(void) {
    ifstream in("algsort.in");
    ofstream out("algsort.out");

    int n, i;
    in >> n;

    int v[n];
    for (i = 0; i < n; i++)
        in >> v[i];

    heapsort(v, n);

    for (i = 0; i < n; i++)
        out << v[i] << ' ';

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