Cod sursa(job #2751110)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 14 mai 2021 11:29:49
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <iostream>
#include <stdio.h>

using namespace std;
const int NMAX = 500000;
int myHeap[NMAX + 1], lastPos;

inline int lSon(int node);
inline int rSon(int node);
inline int father(int node);
inline void sift(int node);
inline void percolate(int node);
inline void cut(int node);
inline void heapify();

int main()
{
    FILE *fin = fopen("algsort.in", "r");
    fscanf(fin, "%d", &lastPos);
    int i;
    for (i = 1; i <= lastPos; i++)
        fscanf(fin, "%d", &myHeap[i]);
    fclose(fin);
    heapify();

    FILE *fout = fopen("algsort.out", "w");
    while (lastPos)
    {
        fprintf(fout, "%d ", myHeap[1]);
        cut(1);
    }
    fclose(fout);

    return 0;
}

inline int lSon(int node) {return node << 1;}
inline int rSon(int node) {return (node << 1) + 1;}
inline int father(int node) {return node >> 1;}
inline void sift(int node)
{
    int son;
    do
    {
        son = 0;
        if (lSon(node) <= lastPos && myHeap[lSon(node)] < myHeap[node])
            son = lSon(node);
        if (rSon(node) <= lastPos && myHeap[rSon(node)] < myHeap[lSon(node)] && myHeap[rSon(node)] < myHeap[node])
            son = rSon(node);
        if (son)
        {
            swap(myHeap[node], myHeap[son]);
            node = son;
        }
    }while (son);
}
inline void percolate(int node)
{
    while (father(node) && myHeap[node] < myHeap[father(node)])
    {
        swap(myHeap[node], myHeap[father(node)]);
        node = father(node);
    }
}
inline void cut(int node)
{
    swap(myHeap[node], myHeap[lastPos--]);
    if (node == 1)
        sift(node);
    else
    {
        if (myHeap[node] < myHeap[father(node)])
            percolate(node);
        else
            sift(node);
    }
}
inline void heapify()
{
    for (int i = (lastPos >> 1); i > 0; i--)
        sift(i);
}