Cod sursa(job #1915509)

Utilizator stefan_bogdanstefan bogdan stefan_bogdan Data 8 martie 2017 21:21:32
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <stdio.h>

#define MAXN    500003

#define inFile  "algsort.in"
#define outFile "algsort.out"

using namespace std;

int Heap[MAXN], index;
int n;

inline int Tata(int k)
{
  return (k >> 1);
}

inline int FiuD(int k)
{
  return (k << 1) + 1;
}

inline int FiuS(int k)
{
  return (k << 1);
}

template <typename T>
inline void swap1(T& a, T& b)
{
  T aux = a; a = b; b = aux;
}

void Sus(int k)
{
  while (Tata(k) >= 1 && Heap[k] < Heap[Tata(k)])
  {
    swap(Heap[k], Heap[Tata(k)]);
    k /= 2;
  }
}

void Jos(int k, int n)
{
  int Fiu; /* Fiul unde incerc sa merg */
  while (true)
  {
    Fiu = 0; /* Initial nu am niciun fiu valid, urmeaza sa aleg fiul cu valoarea minima */
    if (FiuS(k) <= n) Fiu = FiuS(k); /* Aleg fiul din stanga initial, daca exista */
    if (FiuD(k) <= n && Heap[Fiu] > Heap[FiuD(k)]) Fiu = FiuD(k); /* Incerc sa aleg fiul din dreapta, daca e mai mic */
    if (Heap[k] > Heap[Fiu] && Fiu) /* Daca Tata este mai mare decati fiul SI am un fiu valid */
    {
      swap(Heap[k], Heap[Fiu]); /* Ii inteschimb */
      k = Fiu; /* Fiul devine tata */
    }
    else return; /* Nu am nimic de actualizat, ma opresc */
  }
}

void Adaugare(int x)
{
  Heap[++index] = x; /* Adaug in Heap nodul x */
  Sus(index); /* Si incerc sa-l urc cat pot de mult */
}

void HeapSort(void)
{
  for (int i = n; i > 1; i--)
  {
    swap(Heap[1], Heap[i]); /* Interschimb priml nod cu ultimul */
    Jos(1, i - 1); /* Si incerc sa-l cobor cat pot de mult */
  }
}

void read(void)
{
  FILE * f = fopen(inFile, "r");
  fscanf(f, "%d", &n);
  for(int i = 1, x; i <= n; i++)
  {
    fscanf(f, "%d", &x);
    Adaugare(x);
  }
  fclose(f);
}

void write(void)
{
  FILE * g = fopen(outFile, "w");
  for (int i = n; i >= 1; i--)
  {
    fprintf(g, "%d ", Heap[i]);
  }
  fclose(g);
}

int main()
{
  read();
  HeapSort();
  write();
  return 0;
}