Pagini recente » Borderou de evaluare (job #1372052) | Borderou de evaluare (job #458071) | Borderou de evaluare (job #2806280) | Borderou de evaluare (job #537010) | Cod sursa (job #2817272)
#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;
}