Cod sursa(job #1810097)

Utilizator andreiugravuFMI Andrei Zugravu andreiugravu Data 19 noiembrie 2016 16:35:40
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
//HeapSort

#include <fstream>

using namespace std;

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

#define dimMax 500005

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

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] > minHeap[2*j + 1] && 2*j < k)) {
        if(minHeap[j] > minHeap[2*j] && minHeap[j] > minHeap[2*j + 1]) { //C1
            if(minHeap[2*j] < minHeap[2*j + 1]) {
                swap(minHeap[2*j], minHeap[j]);
                j = 2*j;
            }
            else {
                swap(minHeap[2*j +1], minHeap[j]);
                j = 2*j + 1;
            }
        }
        else if(minHeap[2*j] < minHeap[j]) { //C2
            swap(minHeap[2*j], minHeap[j]);
            j = 2*j;
        }
        else { //C3
            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;
}