Cod sursa(job #1838750)

Utilizator BLz0rDospra Cristian BLz0r Data 1 ianuarie 2017 18:09:35
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
/* Sortare folosita: HeapSort */
#include <fstream>
using namespace std;

#define NMAX 500002
#define L(x) ((x) << 1)
#define R(x) ((x) << 1) + 1

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

void max_heapify(int H[], int N, int i) {

    int left, right, largest;
    bool changed;

    do {
        changed = false;

        left = L(i);
        right = R(i);

        if (left <= N && H[left] > H[i])
            largest = left;
        else
            largest = i;

        if (right <= N && H[right] > H[largest])
            largest = right;

        if (i != largest) {
            swap(H[i], H[largest]);
            i = largest;
            changed = true;
        }

    } while (changed == true);
}

void build_max_heap(int H[], int N) {

    for (int i = N / 2; i >= 1; --i)
        max_heapify(H, N, i);
}

void heapsort(int H[], int N) {

    build_max_heap(H, N);

    for (int i = N; i >= 2; --i) {
        swap(H[i], H[1]);
        N--;
        max_heapify(H, N, 1);
    }
}

int v[NMAX];

int main() {

    int N;
    fin >> N;

    for (int i = 1; i <= N; ++i)
        fin >> v[i];

    heapsort(v, N);

    for (int i = 1; i <= N; ++i)
        fout << v[i] << " ";

    return 0;
}