Cod sursa(job #2016811)

Utilizator PetrescuAlexandru Petrescu Petrescu Data 30 august 2017 15:30:47
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>
#define MAX 500001

using namespace std;
int v[MAX];
inline int father(int k)
{
  return k / 2;
}
inline int left_son(int k)
{
  return k * 2;
}
inline int right_son(int k)
{
  return k * 2 + 1;
}
inline void sift(int n, int k)
{
  int son;

  do
  {
    son = 0;
    if(left_son(k) <= n)
    {
      son = left_son(k);
      if(right_son(k) <= n && v[right_son(k)] > v[son])son = right_son(k);
      if(v[son] > v[k])
      {
        swap(v[son], v[k]);
        k = son;
      }
      else son = 0;
    }
  }while(son != 0);
}
inline void percolate(int k)
{
  while(k > 1 && v[k] > v[father(k)])
  {
    swap(v[k], v[father(k)]);
    k = father(k);
  }
  swap(v[k], v[father(k)]);
}
inline void build_heap(int n)
{
  for(int i = n / 2; i >= 1; i--)sift(n, i);
}
inline void heap_sort(int n)
{
  for(int i = n; i >= 2; i--)
  {
    swap(v[i], v[1]);
    sift(i - 1, 1);
  }
}
int main()
{
  int n, i;

  ifstream in;
  ofstream out;
  in.open("algsort.in");
  out.open("algsort.out");
  in >> n;
  for(i = 1; i <= n; i++)in >> v[i];
  build_heap(n);
  heap_sort(n);
  for(i = 1; i <= n; i++)out << v[i] << " ";
  in.close();
  out.close();
  return 0;
}