Cod sursa(job #2492989)

Utilizator maria15Maria Dinca maria15 Data 15 noiembrie 2019 19:27:51
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
/// HEAPSORT

#include <fstream>

using namespace std;

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

int n, i, v[1000001], p, c, minim;

int main(){
    /// in prima instanta, vreau ca orice parinte sa fie mai mare decat fiii lui
    /// cat timp un numar este mai mare decat cel de dinainte din lant, il mut
    fin>>n;
    fin>>v[1];
    minim = v[1];
    for(i=2;i<=n;i++){
        fin>>v[i];
        p = i/2;
        c = i;
        while(v[c] > v[p] && p > 0){
            swap(v[c], v[p]);
            c = p;
            p /= 2;
        }
        if(v[i] < minim)
            minim = v[i];
    }
    /// acum, caut sa pun varful heapului cat mai aproape de final
    /// pentru asta, duc fiecare nod plecand de la final in varful heapului
    /// varful anterior al heapului trece pe pozitia curenta
    /// si apoi repar stricaciunile cauzate de modificarea heapului
    /// adica refac heapul
    /// dupa refacere, in varf voi avea un maxim corect, din heapul ramas
    /// iar la pasul urmator, il voi pune la final, la urmatoarea pozitie curenta, dupa cel pus la pasul acesta
    /// acela este sigur mai mare decat cel nou
    /// si apar puse descrescator de la final la inceput
    /// adica, practic, sortate crescator
    /// de fapt, algoritmul pune maximele in ordine la final
    /// si reface heapul dupa eliminarea lor

    for(i=n;i>0;i--){
        swap(v[1], v[i]);
        p = 1;
        c = 2;
        if(v[c] < v[c+1])
            c++;
        while(v[c] > v[p] && c < i){
            swap(v[c], v[p]);
            p = c;
            c *= 2;
            if(v[c] < v[c+1])
                c++;
        }
    }
    for(i=1;i<=n;i++)
        fout<<v[i]<<" ";
    return 0;
}