Cod sursa(job #371554)

Utilizator GotenAmza Catalin Goten Data 5 decembrie 2009 19:41:10
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<fstream>

using namespace std;

long H[500000];


const long MAX_HEAP_SIZE = 16384;
typedef long Heap[MAX_HEAP_SIZE];

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

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

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



void sift(Heap H, long N, long K) {
    long 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 longerschimba H[K] cu H[son].
            K = son;
        }
    } while (son);
}


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

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

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

int main()
{ 
	long i,n;
	ifstream f("algsort.in");
	ofstream g("algsort.out");
	f>>n;
	for(i=1;i<=n;i++)f>>H[i];
	heapsort(H,n);
	for(i=1;i<=n;i++)g<<H[i]<<' ';
	return 0;
}