Cod sursa(job #1479610)

Utilizator bpalaniciPalanici Bogdan bpalanici Data 31 august 2015 18:27:28
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");
typedef int H[500005];

H Heap;
int n;

inline int father(int nod)
{
    return nod >> 1;
}

inline int left_son(int nod)
{
    return nod << 1;
}

inline int right_son(int nod)
{
    return (nod << 1) + 1;
}

void downheap(H Heap, int n, int k)
{
    int nod = 1;
    for (; nod;)
    {
        nod = 0;
        if (left_son(k) <= n)
        {
            nod = left_son(k);
            if (right_son(k) <= n && Heap[left_son(k)] < Heap[right_son(k)])
            nod = right_son(k);
        }
        if (Heap[nod] < Heap[k]) nod = 0;
        if (nod)
        {
            swap(Heap[nod], Heap[k]);
            k = nod;
        }
    }
}

void form_heap(H Heap, int n)
{
    for (int i = n >> 1; i >= 1; i--)
        downheap(Heap, n, i);
}

void H_sort(H Heap, int n)
{
    form_heap(Heap, n);
    for (int i = n; i > 1; i--)
        swap(Heap[1], Heap[i]),
        downheap(Heap, i - 1, 1);
}

int main()
{
    fin >> n;
    for (int i = 1; i <= n; i++)
        fin >> Heap[i];
    H_sort(Heap, n);
    for (int i = 1; i <= n; i++)
        fout << Heap[i] << " ";
    return 0;
}