Cod sursa(job #1813560)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 23 noiembrie 2016 00:31:17
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
/** HEAP SORT **/
#include <iostream>
#include <fstream>
#define NMAX 500001

using namespace std;

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

typedef int Heap[NMAX];
Heap H;
int n;

void sift(Heap H, int N, int k)
{
    int son;
    do
    {
        son = 0;
        if (2 * k <= N)
        {
            son = 2 * k;
            if (2 * k + 1 <= N && H[son] > H[2 * k + 1])
                son = 2 * k + 1;
            if (H[k] <= H[son])
                son = 0;
        }
        if (son)
        {
            swap(H[k], H[son]);
            k = son;
        }
    }while(son);
}

void percolate(Heap H, int N, int k)
{
    int key = H[k];
    while (k > 1 && H[k / 2] > key)
    {
        H[k] = H[k / 2];
        k = k / 2;
    }
    H[k] = key;
}

void cut(Heap H, int &N, int k)
{
    swap(H[k], H[N]);
    N--;
    if (k > 1 && H[k] < H[k / 2])
        percolate(H, N, k);
    else
        sift(H, N, k);
}

void insert(Heap H, int &N, int key)
{
    H[++N] = key;
    percolate(H, N, N);
}

int main()
{
    in >> n;
    for (int i = 1; i <= n; i++)
        in >> H[i];
    in.close();
    for (int i = n / 2; i >= 1; i--)
        sift(H, n, i);
    while (n)
    {
        out << H[1] << " ";
        cut(H, n, 1);
    }
    out.close();
    return 0;
}