Cod sursa(job #2817272)

Utilizator victorzarzuZarzu Victor victorzarzu Data 13 decembrie 2021 12:53:31
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f
#define get_byte(x) ((x >> (8 * byte)) & 0xff)

using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int n;
int arr[500001];

void read()
{
  f>>n;
  for(int i = 1;i <= n;++i)
    f>>arr[i];
}

void update_heap(int *heap, int position, int heap_size)
{
  int left = 2 * position;
  int right = 2 * position + 1;
  int largest = position;

  if(left <= heap_size && heap[left] >= heap[largest])
    largest = left;
  if(right <= heap_size && heap[right] >= heap[largest])
    largest = right;
  
  if(largest != position)
  {
    swap(heap[largest], heap[position]);
    update_heap(heap, largest, heap_size);
  }
}

void build_heap(int *arr)
{
  for(int i = n / 2;i >= 1;--i)
    update_heap(arr, i, n);
}

void heap_sort(int *arr)
{
  build_heap(arr);
  int heap_size = n;
  for(int i = n;i >= 2;--i)
    {
      swap(arr[i], arr[1]);
      --heap_size;
      update_heap(arr, 1, heap_size);
    }
}

void solve()
{
  heap_sort(arr);
  for(int i = 1;i <= n;++i)
    g<<arr[i]<<" ";
}

int main()
{
  read();
  solve();
  return 0;
}