Cod sursa(job #1810044)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 19 noiembrie 2016 15:51:53
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
//HeapSort

#include <fstream>

using namespace std;

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

#define dimMax 500000

int N;
int x;
int minHeap[dimMax];
int k;
int i, j;

void pushHeap() {
    k++;
    minHeap[k] = x;
    j = k;

    while(j > 1 && minHeap[j/2] > minHeap[j]) {
        swap(minHeap[j/2], minHeap[j]);
        j /= 2;
    }
}

void popHeap() {
    swap(minHeap[1], minHeap[k]);
    k--;
    j = k;

    while(j > 1 && minHeap[j/2] > minHeap[j]) {
        swap(minHeap[j/2], minHeap[j]);
        j /= 2;
    }

    j = 1;
    while((minHeap[j] > minHeap[2*j] && 2*j <= k) || (minHeap[j] > 2*j + 1 && 2*j <= k)) {
        if(minHeap[2*j] < minHeap[2*j + 1]) {
            swap(minHeap[2*j], minHeap[j]);
        }
        else {
            swap(minHeap[2*j + 1], minHeap[j]);
        }
        j = 2*j + 1;
    }
}

int main()
{
    fin>>N;
    for(i = 1 ; i <= N ; i++) {
        fin>>x;
        pushHeap();
    }

    for(i = 1 ; i <= N ; i++) {
        popHeap();
    }

    for(i = N ; i >= 1 ; i--)
        fout<<minHeap[i]<<' ';

    fin.close();
    fout.close();

    return 0;
}