Cod sursa(job #1263182)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 14 noiembrie 2014 00:20:42
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>

typedef int Heap[1<<19];

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

inline int left_son(int node) 
{
    return node * 2;
}

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

inline void swap(int *a, int *b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void sift(Heap h, int n, int k)
{
    int node = 0;
    do {
        if (left_son(k) <= n) node = left_son(k);
        if (right_son(k) <= n && h[right_son(k)] > h[left_son(k)])
            node = right_son(k);
        if (h[node] <= h[k]) node = 0;
        if (node) {
            swap(&h[node], &h[k]);
            k = node;
        }
    } while(node);
}

void build_heap(Heap h, int n)
{
    int i;
    for (i = n / 2; i >= 0; i--) {
        sift(h, n, i);
    }
}

void heap_sort(Heap h, int n) 
{
    int i;
    build_heap(h, n - 1);
    for (i = n - 1; i > 0; i--) {
        swap(&h[0], &h[i]);
        sift(h, i - 1, 0);
    }
}

int main()
{
    int n, i;
    Heap h;
    FILE *fdin = fopen("algsort.in", "r");
    FILE *fdout = fopen("algsort.out", "w");
    fscanf(fdin, "%d", &n);
    for (i = 0; i < n; i++) fscanf(fdin, "%d", &h[i]);
    heap_sort(h, n);
    for (i = 0; i < n; i++) fprintf(fdout, "%d ", h[i]);
    return 0;
}