Cod sursa(job #908570)

Utilizator bogdan...Marchis Bogdan Cristian bogdan... Data 9 martie 2013 17:54:27
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#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;
}