Cod sursa(job #283321)

Utilizator dudu77tTudor Morar dudu77t Data 18 martie 2009 23:35:44
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>

int n, heap_size;
int sir[500001], heap[500001], poz[500001];
void read();
void sort();
void write();
void move_down(int);
inline void swap(int&, int&);

int main()
{
    read();
    sort();
    write();
    return 0;
}

void move_down(int tata)
{
	int fiu, h_tata = heap[tata];
	for (fiu = tata * 2; fiu <= heap_size; fiu *= 2)
	{
		if (fiu < heap_size)
		{
			if (sir[heap[fiu+1]] > sir[heap[fiu]])
			{
				++fiu;
			}
		}
		if (sir[h_tata] >= sir[heap[fiu]])
		{
			break;
		}
		heap[fiu/2] = heap[fiu];
		poz[heap[fiu/2]] = fiu / 2;
	}
	fiu /= 2;
	heap[fiu] = h_tata;
	poz[heap[fiu]] = fiu;
}

void sort()
{
    int i;
    heap_size = n;
    for (i = n / 2; i >= 1; --i)
	{
		move_down(i);
	}
	swap(heap[1], heap[heap_size]);
	for (heap_size = n - 1; heap_size >= 1; --heap_size)
	{
		poz[heap[1]] = 1;
		move_down(1);
		swap(heap[1], heap[heap_size]);
	}
}

void read()
{
    int i;
    FILE *fin = fopen ("algsort.in", "r");
    fscanf (fin, "%d", &n);
//    sir = new int[n+1];
//    heap = new int[n+1];
//    poz = new int[n+1];
    for (i = 1; i <= n; ++i)
    {
        fscanf (fin, "%d", &sir[i]);
        heap[i] = i;
        poz[i] = i;
    }
    fclose (fin);
}

void write()
{
    int i;
    FILE *fout = fopen ("algsort.out", "w");
    for (i = 1; i <= n; ++i)
    {
        fprintf (fout, "%d ", sir[heap[i]]);
    }
    fprintf (fout, "\n");
    fclose (fout);
}

inline void swap(int &a, int &b)
{
	int t = a;
	a = b;
	b = t;
}