Cod sursa(job #2287129)

Utilizator mirunazMiruna Zavelca mirunaz Data 21 noiembrie 2018 15:35:52
Problema Sortare prin comparare Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include<stdio.h>

int fiuDr(int node) {
    return 2*node+1;
}

int fiuSt(int node) {
    return 2*node;
}

int Schimb(int node1, int node2, int v[]) {
    if(v[node1] > v[node2]) {
        int aux = v[node2]; v[node2] = v[node1]; v[node1] = aux;
        return node1;
    }
    return node2;
}

void HeapDown(int n, int x, int v[]) {
    while((fiuDr(x) <= n && v[fiuDr(x)] > v[x]) || (fiuSt(x) <= n && v[fiuSt(x)] > v[x])) {
        if(fiuDr(x) <= n && v[fiuDr(x)] > v[fiuSt(x)]) {
            x = Schimb(fiuDr(x), x, v);
        } else {
            x = Schimb(fiuSt(x), x, v);
        }
    }
}

void Afisare(FILE *out, int n, int v[]) {
    int i;
    for(i=1; i<=n; i++) {
        fprintf(out, "%d ", v[i]);
    }
    //fprintf(out, "\n");
}

void Extract(int n, int v[]) {
    if(n < 2)
        return ;
    Schimb(1, n, v);
    HeapDown(n-1, 1, v);
}

int main ()
{
    FILE *in, *out;
    in = fopen("algsort.in", "r");
    out = fopen("algsort.out", "w");
    int n, i;
    fscanf(in, "%d", &n);
    int v[n+1];
    for(i=1; i<=n; i++) {
        fscanf(in, "%d", &v[i]);
    }

    for(i=n/2; i>0; i--) {
        HeapDown(n, i, v);
    }

    //Afisare(out, n, v);

    int m = n;
    for(i=1; i<=n; i++) {
        Extract(m, v);
        m --;
    }

    Afisare(out, n, v);

    return 0;
}