Cod sursa(job #883090)

Utilizator RobertSSamoilescu Robert RobertS Data 19 februarie 2013 18:39:31
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
using namespace std;


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

const int MAX_HEAP_SIZE = 500000;
typedef int Heap[MAX_HEAP_SIZE];
long n;
Heap v;

inline int father(int nod) {
    return nod / 2;
}

inline int left_son(int nod) {
    return nod * 2;
}

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

inline int max(Heap H) {
    return H[1];
}


void sift(Heap H, int N, int K) {
    int son;
    do {
        son = 0;
        // Alege un fiu mai mare ca tatal.
        if (left_son(K) <= N) {
            son = left_son(K);
            if (right_son(K) <= N && H[right_son(K)] > H[left_son(K)]) {
                son = right_son(K);
            }
            if (H[son] <= H[K]) {
                son = 0;
            }
        }

        if (son) {
            swap(H[K], H[son]);  // Functie STL ce interschimba H[K] cu H[son].
            K = son;
        }
    } while (son);
}

void build_heap(Heap H, int N) {
    for (int i = N / 2; i > 0; --i) {
        sift(H, N, i);
    }
}


void heapsort(Heap H, int N) {
    build_heap(H, N);

    // Sorteaza vectorul.
    for (int i = N; i >= 2; --i) {
        swap(H[1], H[i]);
        sift(H, i - 1, 1);
    }
}

int main()
{

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

    heapsort(v, n);

    for(long i=1; i<=n; i++)
      fout << v[i] << " ";

    return 0;
}