Cod sursa(job #1525443)

Utilizator FayedStratulat Alexandru Fayed Data 15 noiembrie 2015 01:34:27
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
#include <stdlib.h>
#define NMAX 500001

int Heap[NMAX];
int N;

int father(int node) {
    return node/2;
}

int left_child(int node) {
    return node<<1;
}

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

void swap(int *x, int *y) {
    
    int aux;
    aux = *x;
    *x  = *y;
    *y  = aux;
}

void goDown(int Heap[NMAX], int N, int K) {
    
    int child;
    
    do {
        child = 0;
        
        if(left_child(K) <= N) {
            child = left_child(K);
            
            if(right_child(K) <= N && Heap[right_child(K)] > Heap[child]) {
                child = right_child(K);
            }
            if(Heap[K] >= Heap[child]) {
                child = 0;
            }
        }
        if(child) {
            swap(&Heap[child], &Heap[father(child)]);
            K = child;
        }
    } while(child);
}

void buildHeap(int Heap[NMAX], int N) {
    
    for(int nodes = N / 2; nodes > 0; --nodes)
        goDown(Heap, N, nodes);
}

void reads() {
    
    freopen("algsort.in",  "r", stdin);
    freopen("algsort.out", "w", stdout);
    
    scanf("%d", &N);
    
    for(int i = 1; i <= N; ++i)
        scanf("%d", &Heap[i]);
}

void sortHeap(int Heap[NMAX], int N) {
    
    for(int i = N; i > 1; --i) {
        swap(&Heap[1], &Heap[i]);
        goDown(Heap, i - 1, 1);
    }
}

int main(void) {
    
    reads();
    buildHeap(Heap, N);
    sortHeap(Heap, N);
    
    for(int i = 1; i <= N; ++i)
        printf("%d ", Heap[i]);
    
    return 0;
}