Pagini recente » Cod sursa (job #2548389) | Cod sursa (job #989680) | Cod sursa (job #214291) | Cod sursa (job #945415) | Cod sursa (job #911895)
Cod sursa(job #911895)
#include <stdio.h>
int v[500001], N, heap_size;
void exchange (int *a, int *b)
{
int aux;
aux = *a;
*a = *b;
*b = aux;
}
int parrent (int i)
{
return i >> 1;
}
int left (int i)
{
return i << 1;
}
int right (int i)
{
return (i << 1) + 1;
}
void max_heapify (int i)
{
int l, r, largest;
l = left (i);
r = right (i);
if (l <= heap_size && v[l] > v[i])
largest = l;
else
largest = i;
if (r <= heap_size && v[r] > v[largest])
largest = r;
if (largest != i)
{
exchange (&v[largest], &v[i]);
max_heapify (largest);
}
}
void build_heap()
{
for (int i = N / 2; i > 0; i--)
max_heapify (i);
}
int main ()
{
int i;
freopen ("algsort.in", "r", stdin);
freopen ("algsort.out", "w", stdout);
scanf ("%d", &N);
heap_size = N;
for (i = 1; i <= N; i++)
scanf ("%d", &v[i]);
build_heap ();
for (i = N; i > 1; i--)
{
exchange (&v[1], &v[i]);
heap_size--;
max_heapify (1);
}
for (i = 1; i <= N; i++)
printf ("%d ", v[i]);
printf ("\n");
return 0;
}