Cod sursa(job #323269)

Utilizator emilia.ciobanuCiobanu Emilia Maria Silvia emilia.ciobanu Data 11 iunie 2009 15:12:22
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.77 kb
#include<stdio.h>
#include<stdlib.h>

#define MINIM 666794

typedef struct heap
{
		int *values;
		int dim;
		int cap;
} hvect, *HVect;

HVect CreateVect ( int *values, int dim, int cap )
{
		int i;

		HVect H = (HVect)calloc(1, sizeof(hvect));
		H->dim = dim;
		H->cap = cap;
		H->values = (int*)calloc(dim+1, sizeof(int) );

		for(i = 1; i <= H->dim; i++)
				H->values[i] = values[i-1];
		
		return H;
}

void FreeVect( HVect H )
{
		free(H->values);
		free(H);
}


void DFilterR ( HVect H, int poz )
{
		int left = 2*poz;
		int right = 2*poz+1;
		int minim = MINIM;

		if ( left <= H->dim && H->values[left] < H->values[poz] )
				minim = left;
		else minim = poz;
		if ( right <= H->dim && H->values[right] < H->values[minim] )
				minim = right;
		if ( minim != poz)
		{
				int aux = H->values[poz];
				H->values[poz] = H->values[minim];
				H->values[minim] = aux;

				DFilterR( H, minim );
		}
}

int ExtractMin ( HVect H )
{
		int aux = H->values[1];
		H->values[1] = H->values[H->dim];
		H->dim--;
		DFilterR( H, 1);

		return aux;
}

void CreateHeap ( HVect H)
{
		int i;

		for( i = H->dim/2; i >= 1; i--)
				DFilterR (H, i);
}

void Print (HVect H)
{
		int i;
		for(i = 1 ; i <= H->dim ; i++ ) 
				printf("%d ", H->values[i]);
		printf("\n");
}

void HeapSort(int *A, int n)
{
		HVect H = CreateVect(A, n, n);
		CreateHeap(H);

		int *V = (int*)calloc(n, sizeof(int));

		int i;

		for(i = 0 ; i < n; i++)
				*(V+i) = ExtractMin(H);
		for(i = 0 ; i < n ; i++)
				printf("%d ", *(V+i));
		printf("\n");

		free(V);
		FreeVect(H);
}

int main(void)
{
		freopen("algsort.in", "r", stdin);
		freopen("algsort.out", "w", stdout);

		int n, i, *A;
		scanf("%d", &n);
		A = (int*)calloc(n, sizeof(int));
		for (i = 0; i < n ; i++)
				scanf("%d", (A+i));
		HeapSort(A, n);
		free (A);

		return 0;
}