Cod sursa(job #1711230)

Utilizator ArkinyStoica Alex Arkiny Data 30 mai 2016 20:41:51
Problema Sortare prin comparare Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 4.68 kb
#include<stdio.h>

struct node_heap
{
	int data;

	struct node_heap *l, *r;
};

typedef struct node_heap node_heap;

struct node_list
{
	int data;
	struct node_list *next;
};

typedef struct node_list node_list;


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

void interclasare(int *x, int *v, int sx, int fx, int sy, int fy)
{
	int i = sx, j = sy, k = 0;
	while (i <= fx && j <= fy)
	{
		if (x[i] <= x[j])
		{
			v[++k] = x[i];
			++i;
		}
		else
		{
			v[++k] = x[j];
			++j;
		}
	}
	if (i>fx)
		for (int t = j;t <= fy;++t)
			v[++k] = x[t];
	if (j>fy)
		for (int t = i;t <= fx;++t)
			v[++k] = x[t];

	for (int i = 1;i <= k;i++)
		x[sx + i - 1] = v[i];

}

void mergesort(int *x, int *v, int s, int f)
{
	if (s != f)
	{
		mergesort(x, v, s, (s + f) / 2);
		mergesort(x, v, (s + f) / 2 + 1, f);
		interclasare(x, v, s, (s + f) / 2, (s + f) / 2 + 1, f);
	}
}


void quicksort(int *v, int x, int y)
{
	if (x < y)
	{
		int mid = (x + y) / 2;
		int piv = v[mid];
		int i = x, j = y;

		while (i <= j)
		{
			while (v[i] < piv)
				++i;
			while (v[j] > piv)
				--j;

			if (i <= j)
			{
				swap(v[i], v[j]);
				++i, --j;
			}
		}

		quicksort(v, x, j);
		quicksort(v, i, y);
	}

}


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

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


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

			root->l = temp_node_heap;

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

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

}

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

	*size = *size + 1;
	vec[*size] = root->data;

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

void initialise_list(node_list **node)
{
	*node = NULL;
}

void add_to_list(node_list** node, int data)
{
	node_list *p = (node_list*)malloc(sizeof(node_list));
	p->data = data;
	p->next = *node;
	*node = p;
}
void remove_first_list(node_list **node)
{
	if (node)
	{
		node_list *p = *node;
		*node = p->next;
		free(p);
	}
}

int get_first_elem_list(node_list **node)
{
	if (*node)
		return (*node)->data;

	return -1;
}

void initialise_queue(int *sq, int *eq)
{
	*sq = *eq = -1;
}

void add_to_queue(int *queue, int *sq, int *eq, int MAX, int data)
{
	if (*sq == (-1) && *eq == (-1))
		*sq = *eq = 1, queue[*eq] = data;
	else
	{
		int t = (*eq + 1) % (MAX - 1);
		if (t == 0)
			t = 1;
		queue[t] = data;
		*eq = t;
	}
}
int is_empty_queue(int *sq, int *eq)
{
	if (*sq == (-1) && *eq == (-1))
		return 1;
	else
		return 0;
}
void pop_queue(int *sq, int *eq, int MAX)
{
	int t = (*sq + 1) % (MAX - 1);
	if (t == 0)
		t = 1;
	*sq = t;
	if (*sq > *eq)
		*sq = *eq = -1;
}

int  queue_front(int *queue, int *sq)
{
	return queue[*sq];
}

void DFS(node_list *V[], int *viz, int t)
{
	viz[t] = 1;
	while (V[t])
	{
		if (!viz[V[t]->data])
			DFS(V, viz, V[t]->data);
		remove_first_list(V[t]);
	}
}

void BFS(node_list *V[], int size, int *viz, int s)
{
	int *queue = (int*)malloc(sizeof(int) * size);
	int sq, eq;

	initialise_queue(&sq, &eq);

	add_to_queue(queue, &sq, &eq, size + 1, s);

	while (!is_empty_queue(&sq, &eq))
	{
		int node = queue_front(queue, &sq);
		viz[node] = 1;
		int el;
		do
		{
			el = get_first_elem_list(V[node]);
			if (el != -1)
			{
				if (!viz[el])
				{
					viz[el] = 1;
					add_to_queue(queue, &sq, &eq, size + 1, el);
				}
				remove_first_list(V[node]);
			}
		} while (el != -1);

		pop_queue(&sq, &eq, size + 1);
	}

	free(queue);
}

void sort_top(node_list *V[], int *viz, node_list **stk, int t)
{
	viz[t] = 1;
	node_list *p = V[t];
	while (p)
	{
		if (!viz[p->data])
		{
			viz[p->data] = 1;
			sort_top(V, viz, stk, p->data);
		}
		p = p->next;
	}
	add_to_list(stk, t);

}

FILE *in, *out;
int N, h[500010],v[500010],N;
int main()
{
	in = fopen("algsort.in", "r");
	out = fopen("algsort.out", "w");


	fscanf(in, "%d", &N);
	for (int i = 1;i <= N;++i)
		fscanf(in, "%d", &h[i]);
	
	quicksort(h, 1, N);

	for (int i = 1;i <= N;++i)
		fprintf(out, "%d ", h[i]);


	return 0;
}