Cod sursa(job #1670780)

Utilizator ArkinyStoica Alex Arkiny Data 1 aprilie 2016 00:05:52
Problema Sortare prin comparare Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.72 kb
#include<stdio.h>

FILE *in, *out;

struct node
{
	int data;

	struct node *l, *r;
};

typedef struct node Node;

Node *root=NULL;

int sorted_vector[500010], sorted_vect_size, N;

void initialise_heap(Node **root, int data)
{
	*root = (Node*)malloc(sizeof(Node));

	(*root)->data = data;
	(*root)->l = NULL;
	(*root)->r = NULL;
}


void add_to_heap(Node *root, int data)
{
	if (data < root->data)
	{
		if (root->l == NULL)
		{
			Node *temp_node = (Node*)malloc(sizeof(Node));
			temp_node->data = data;
			temp_node->l = 0;
			temp_node->r = 0;

			root->l = temp_node;

		}
		else
			add_to_heap(root->l, data);
	}
	else
	{
		if (root->r == NULL)
		{
			Node *temp_node = (Node*)malloc(sizeof(Node));
			temp_node->data = data;
			temp_node->l = 0;
			temp_node->r = 0;

			root->r = temp_node;
		}
		else
			add_to_heap(root->r, data);
	}

}

void heap_sort(Node *root, int *vec)
{
	if (root->l != 0)
		heap_sort(root->l, vec);

	++sorted_vect_size;
	vec[sorted_vect_size] = root->data;

	if (root->r != 0)
		heap_sort(root->r, vec);
}

void initialise_files()
{
	in = fopen("algsort.in", "r");
	out = fopen("algsort.out", "w");
}

void close_files()
{
	fclose(in);
	fclose(out);
}

void process_data(FILE *in)
{
	int el;
	fscanf(in,"%d", &N);

	fscanf(in,"%d", &el);
	initialise_heap(&root, el);

	for (int i = 2;i <= N;++i)
	{
		fscanf(in,"%d", &el);
		add_to_heap(root,el);
	}

	heap_sort(root, sorted_vector);
}

void output_data(FILE *out)
{
	for (int i = 1;i <= sorted_vect_size;++i)
		fprintf(out, "%d ", sorted_vector[i]);
}

int main()
{
	initialise_files();
    
	process_data(in);

	output_data(out);

	close_files();

	return 0;
}