Cod sursa(job #1996554)

Utilizator Narcys01Ciovnicu Narcis Narcys01 Data 1 iulie 2017 21:29:34
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <cstdio>

using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

int N;
int h[500005];

int f(int k)
{
    return k/2;
}
int ls(int k)
{
    return 2*k;
}
int rs(int k)
{
    return 2*k + 1;
}

void NDown(int k)
{
    int s;
    do {
        s = 0;
        if (ls(k) <= N) /// are nod stang
            s = ls(k);
        if (rs(k) <= N && h[rs(k)] > h[ls(k)]) /// are nod drept -si- e mai mare
            s = rs(k);
        if (h[s] <= h[k]) /// nodul K e mai mare decat ambii fii
            s = 0;
        if (s)
        {
            swap(h[s], h[k]);
            k = s;
        }
    } while (s);
}

void NUp(int k)
{
    int key = h[k];
    while (k > 1 && key > h[f(k)] )
    {
        h[k] = h[f(k)];
        k = f(k);
    }
    h[k] = key;
}

void Eliminare(int k)
{
    h[k] = h[N];
    N--;
    if (k > 1 && h[k] > h[f(k)])
        NUp(k);
    else
        NDown(k);

}

void Inserare(int k)
{
    N++;
    h[N] = k;
    NUp(N);
}

void Create_H()
{
    int i;
    for (i = N / 2; i > 0; i--)
        NDown(i);
}

void Sortare()
{
    int i, n;
    n = N;
    for (i = n; i >= 2; i--)
    {
        swap(h[1], h[i]);
        N--;
        NDown(1);
    }
    N = n;
}

int main()
{
    int i;
    fin >> N;
    for (i = 1; i <= N; i++)
        fin >> h[i];
    Create_H();
    Sortare();
    for (i = 1; i <= N; i++)
        fout << h[i] << " ";
    fin.close();
    fout.close();
    return 0;
}