Cod sursa(job #2073733)

Utilizator Teodor.mTeodor Marchitan Teodor.m Data 23 noiembrie 2017 16:59:17
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

const int Nmax = 5e5 + 10;
int n;
int Heap[Nmax];

int fiu_st(int nod)
{
    return 2 * nod;
}

int fiu_dr(int nod)
{
    return 2 * nod + 1;
}

void mk_heap(int Heap[], int n, int k)
{
    int fiu;
    do {
        fiu = 0;
        if(fiu_st(k) <= n) { // daca exista un nod mai mic decat tatal
            fiu = fiu_st(k);
            if(fiu_dr(k) <= n && Heap[fiu_dr(k)] > Heap[fiu_st(k)]) // iau fiul cel mai mare ca si valoare
                fiu = fiu_dr(k);
            if(Heap[fiu] <= Heap[k]) // daca valoarea celui mai mare fiu este mai mica decat a tatalui
                fiu = 0; // atunci este bine si ma opresc
        }

        if(fiu) { // inseamna ca inca nu este un heap corect si interschimb fiul cu nodul curent adica tatal
            swap(Heap[k], Heap[fiu]);
            k = fiu;
        }
    }while(fiu);
}

void build_heap(int Heap[], int n)
{
    for(int i = n / 2; i > 0; i--) // pentru fiecare nod care nu este frunza
        mk_heap(Heap, n , i); // pun nodul i pe pozitia buna in heap
}

void HeapSort(int Heap[], int n)
{
    build_heap(Heap, n);

    for(int i = n; i >= 2; i--) { // incepand cu ultima pozitie din heap, gasesc maximul si il pun pe pozitia i
        swap(Heap[i], Heap[1]);
        mk_heap(Heap, i - 1, 1); // urmand sa caut maximul din secventa de i - 1 noduri
    }
}

int main()
{
    fin >> n;

    for(int i = 1; i <= n; ++i) {
        fin >> Heap[i];
    }

    HeapSort(Heap, n);

    for(int i = 1; i <= n; ++i) fout << Heap[i] << " ";

    return 0;
}