Cod sursa(job #2909260)

Utilizator aminaAmina Suciu amina Data 10 iunie 2022 17:22:25
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <iostream>

using namespace std;

int n;
const int nmax=500000;
int arr[nmax];


int heap[nmax];
int heapsize=0;

void checkup(int poz)
{
    if (poz==1)return;
    int tata=poz/2;
    if(heap[poz]<heap[tata])
    {
        swap(heap[poz], heap[tata]);
        checkup(tata);
    }
}
void insereaza(int nr)
{
    heapsize++;
    heap[heapsize]=nr;
    checkup(heapsize);
}

void checkdown(int poz)
{
    if (poz>heapsize)return;
    int caz=0;
    int minval=heap[poz];
    int fiustang=2*poz;
    int fiudrept=2*poz+1;
    if(fiustang<=heapsize)
     if(minval>heap[fiustang])
        {
        minval=heap[fiustang];
        caz=1;
        }
    if(fiudrept<=heapsize)
     if(minval>heap[fiudrept])
    {
        minval=heap[fiudrept];
        caz=2;
    }
    if(caz==1){
            swap(heap[fiustang], heap[poz]);
            checkdown(fiustang);
              }
    if (caz==2){
            swap(heap[fiudrept], heap[poz]);
            checkdown(fiudrept);
               }
}







void sterge (int poz)
{
    swap(heap[poz],heap[heapsize]);
    heapsize--;
    checkdown(poz);
}
void clearheap()
{
    heapsize=0;
}
int popheap()
{
    int temp=heap[1];
    sterge(1);
    return temp;
}

int main()
{
   freopen("algsort.in", "r", stdin);
   freopen("algsort.out", "w", stdout);
   scanf("%d", &n);
   for(int i=0; i<n; i++)
   {
       scanf("%d", &arr[i]);
       insereaza(arr[i]);

   }

   for(int i=0; i<n; i++)printf("%d ", popheap());
}