Cod sursa(job #1982401)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 18 mai 2017 17:51:43
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <fstream>
#include <math.h>
#include <algorithm>
#include <cstdlib>
#include <time.h>

using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");

#define ll long long
#define pb push_back
const int NMax = 5e5 + 5;

// sortare cu algoritmul heapsort

int N;
int v[NMax];

void buildHeap();
// buildHeap() transforma vectorul v intr-un heap
// (fiecare nod i este mai mare ca nodurile de pe pozitiile 2*i si 2*i + 1)
void sift(int);
// sift(i) muta nodul i in jos in heap pana cand acesta se afla in pozitia corespunzatoare

int main() {
    in>>N;
    for (int i=1;i <= N;++i) {
        in>>v[i];
    }

    buildHeap();

    int temp = N;

    // la fiecare iteratie, maximul este pus in coada vectorului
    // si se face un sift pe elementele ramase pentru a determina noul maxim
    while (N) {
        swap(v[1],v[N--]);
        sift(1);
    }

    for (int i=1;i <= temp;++i) {
        out<<v[i]<<' ';
    }
    out<<'\n';

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

void buildHeap() {
    // se face sift pentru fiecare nod i, stiind ca subarborele sau are o structura de heap corecta
    // nodurile de la N/2 + 1 pana la N nu au fii in heap, deci sunt frunze.
    // Astfel, subarborele lor contine un singur nod care are o structura de heap corecta
    for (int i=N/2;i > 0;--i) {
        sift(i);
    }
}

void sift(int node) {
    int son = 0;
    do {
        son = 0;
        int fs = 2*node,
            ss = fs + 1;
        if (fs <= N) {
            son = fs;
            if (ss <= N && v[ss] > v[son]) {
                son = ss;
            }
        }

        if (son && v[son] > v[node]) {
            swap(v[son],v[node]);
            node = son;
        }
        else {
            son = 0;
        }
    }
    while (son);
}