Cod sursa(job #2189870)

Utilizator Horia14Horia Banciu Horia14 Data 29 martie 2018 11:48:50
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#define MAX_N 500000
using namespace std;

int heap[MAX_N + 1], n, heapSize;

inline void Swap(int i, int j) {
    int aux = heap[i];
    heap[i] = heap[j];
    heap[j] = aux;
}

void downHeap(int i) {
    int leftSon, rightSon;
    if(2*i > n) return;
    leftSon = heap[2*i];
    if(2*i + 1 <= n)
        rightSon = heap[2*i + 1];
    else rightSon = leftSon + 1;
    if(leftSon <= rightSon) {
        if(heap[i] <= leftSon) return;
        Swap(i,2*i);
        downHeap(2*i);
    } else {
        if(heap[i] <= rightSon) return;
        Swap(i,2*i+1);
        downHeap(2*i+1);
    }
}

int main() {
    int i;
    FILE* fin, *fout;
    /*fin = fopen("heapsort.in","r");
    fout = fopen("heapsort.out","w");*/
    fin = fopen("algsort.in","r");
    fout = fopen("algsort.out","w");
    fscanf(fin,"%d",&n);
    heapSize = n;
    for(i = 1; i <= n; i++)
        fscanf(fin,"%d",&heap[i]);
    for(i = n/2; i >= 1; i--)
        downHeap(i);
    for(i = 1; i <= heapSize; i++) {
        fprintf(fout,"%d ",heap[1]);
        Swap(1,n);
        n--;
        downHeap(1);
    }
    fprintf(fout,"\n");
    fclose(fin);
    fclose(fout);
    return 0;
}