Cod sursa(job #393321)

Utilizator Addy.Adrian Draghici Addy. Data 9 februarie 2010 11:14:23
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdio.h>
#define Nmax 500020

int v[Nmax], n, i, t, c, aux;

void up(int i) {
	//c - copil, t - tata
	int c, t, aux;
	
	c = i, t = i / 2, aux = v[i];
	while (t >= 1 && aux > v[t]) {
		v[c] = v[t];
		c = t, t /= 2;
	}
	v[c] = aux;
}

int main() {
	
	FILE *f = fopen("algsort.in", "r");
	FILE *g = fopen("algsort.out", "w");
	
	fscanf(f, "%d", &n);
	for (i = 1; i <= n; i++)
		fscanf(f, "%d", &v[i]);
	
	//creez heap
	for (i = 2; i <= n; i++)
		up(i);
	
	//sortez
	for (i = n; i >= 2; i--) {
		//pun ultimul element in varf si primul ramane la sfarsit
		aux = v[1], v[1] = v[i], v[i] = aux;
		
		//corectez heap cu i-1 elemente
		t = 1;
		while (2 * t <= i - 1) {
			c = 2 * t;
			if (2 * t + 1 <= i - 1 && v[2 * t + 1] > v[2 * t])
				c = 2 * t + 1;
			
			if (v[t] < v[c])
				aux = v[t], v[t] = v[c], v[c] = aux;
			else
				break;
			
			t = c;
		}
	}
	
	for (i = 1; i <= n; i++)
		fprintf(g, "%d ", v[i]);
	
	fclose(g); fclose(g);	
	
	return 0;
}