Cod sursa(job #1210565)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 20 iulie 2014 14:37:12
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
/*
 * =====================================================================================
 *
 *       Filename:  heapsort.cpp
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  07/20/2014 13:49:41
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (), 
 *   Organization:  
 *
 * =====================================================================================
 */

#include <cstdio>
#define nmax 100000

using namespace std;

void swap(int* a, int* b)
{
	int aux = *a;
	*a = *b;
	*b = aux;
}

void maxHeapifyDown(int i, int nr, int* heap)
{
	int l, r, x = i;
	l = i << 1;
	r = l + 1;

	if (l <= nr && heap[l] > heap[i])
		x = l;
	if (r <= nr && heap[r] > heap[x])
		x = r;

	if (x != i)
	{
		swap(&heap[i], &heap[x]);
		maxHeapifyDown(x, nr, heap);
	}
}

void buildMaxHeap(int nr, int* heap)
{
	for (int i = nr / 2; i >= 1; i--)
		maxHeapifyDown(i, nr, heap);
}

void heapsort(int nr, int* heap)
{
	buildMaxHeap(nr, heap);
	for (int i = nr; i >= 2; i--)
	{
		swap(&heap[1], &heap[i]);
		nr--;
		maxHeapifyDown(1, nr, heap);
	}
}

int main(int argc, char* argv[])
{
	int n, a[nmax];

	scanf("%d", &n);

	for (int i = 1; i <= n; i++)
		scanf("%d", &a[i]);

	heapsort(n, a);

	for (int i = 1; i <= n; i++)
		printf("%d ", a[i]);

	return 0;
}