Cod sursa(job #1042930)

Utilizator rucarRucareanu Alexandru rucar Data 27 noiembrie 2013 19:59:41
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <limits.h>

int main()
{
	int n, i, m;
	FILE *f = fopen("algsort.in", "r"), *g = fopen("algsort.out", "w");
	fscanf(f,"%d", &n);
	int *v = (int*)malloc(sizeof(int)*(n+10));
	if (sqrt((float)n) == trunc(sqrt((float)n)))
		m = trunc(sqrt((float)n));
	else m = trunc(sqrt((float)n)) + 1;
	int*smen = (int*)malloc(sizeof(int)*(m+10));
	for (i = 0; i < n; i++)
		fscanf(f,"%d", &v[i]);
	int sec = trunc(sqrt((float)n)), j = 0, k = 0, min=INT_MAX;
	for (i = 0; i < n; i++)
	{
		if (!j)  min = INT_MAX;
		if (v[i] < min)
			min = v[i];
		if (j == sec-1)
		{
			smen[++k] = min;
			j = -1;
		}
		j++;
	}
	smen[++k] = min;
	int*sortat = (int*)malloc(sizeof(int)*(n+10));
	int imin;
	k = 0;
	while (k < n)
	{
		min = INT_MAX;
		for (i = 1; i <= m; i++)
		{
			if (smen[i] < min)
			{
				min = smen[i];
				imin = i;
			}
		}
		sortat[k] = min;
		min = INT_MAX;
		j = (imin - 1)*sec;
		while (j < imin*sec && j<n)
		{
			if (v[j] != sortat[k])
			{
				if (v[j] < min)
					min = v[j];
			}
			else v[j] = INT_MAX;
			j++;
		}
		smen[imin] = min;
		k++;
	}
	for (i = 0; i < n; i++)
		fprintf(g,"%d ", sortat[i]);
	return 0;
}