Cod sursa(job #1820916)

Utilizator stefan_bogdanstefan bogdan stefan_bogdan Data 2 decembrie 2016 13:09:01
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <stdio.h>
#include <iostream>

#define MAXN 500000 + 10
#define in   "algsort.in"
#define out  "algsort.out"

using namespace std;

FILE *f, *g;

int n, x, k;
int heap[MAXN];

inline int father(int k)
{
    return k / 2;
}
inline int left_son(int k)
{
    return k * 2;
}
inline int right_son(int k)
{
    return k * 2 + 1;
}
inline void jos(int k, int n)
{
    int son;
    do
    {
        son = 0;
        if (left_son(k) <= n)
        {
            son = left_son(k);
            if (right_son(k) <= n && heap[right_son(k)] > heap[son])
            {
                son = right_son(k);
            }
            if (heap[son] < heap[k])
            {
                son = 0;
            }
        }
        if (son)
        {
            swap(heap[k], heap[son]);
            k = son;
        }
    }
    while (son);
}
inline void sus(int k)
{
    int x = heap[k];
    while (k > 1 && x > heap[father(k)])
    {
        swap(heap[k], heap[father(k)]);
        k = father(k);
    }
}
inline void add(int x)
{
    heap[++k] = x;
    sus(k);
}
inline void read()
{
    fscanf(f, "%d", &n);
    for (int i = 1; i <= n; i++)
    {
        fscanf(f, "%d", &x);
        add(x);
    }
}
inline void heapsort()
{
    for (int i = n / 2; i > 0; i--)
        jos(i, n);

    for (int i = n; i >= 2; i--)
    {
        swap(heap[1], heap[i]);
        jos(1, i - 1);
    }
}
inline void write()
{
     for (int i = 1; i <= n; i++)
        fprintf(g, "%d ", heap[i]);
}
int main()
{
    f = fopen(in, "r");
    g = fopen(out, "w");

    read();
    heapsort();
    write();

    fclose(f);
    fclose(g);
}