Cod sursa(job #525817)

Utilizator icepowdahTudor Didilescu icepowdah Data 26 ianuarie 2011 14:08:53
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
using namespace std;

void heapSort(int* vect, int n);
void buildMaxHeap(int* vect, int n);
void maxHeapify(int* vect, int n, int i);
void interschimbare(int* x, int* y);

int main(void)
{
	int n, *vect;
	
	ifstream f("algsort.in");
	f>>n;
	vect = new int[n+1];
	for (int i=1;i<=n;i++)
	{
		f>>vect[i];
	}
	f.close();

	heapSort(vect,n);

	ofstream g("algsort.out");
	for (int i=1;i<=n;i++)
	{
		g<<vect[i]<<" ";
	}
	g<<endl;

	delete[] vect;
}

void heapSort(int* vect, int n)
{
	buildMaxHeap(vect,n);
	while (n>1)
	{
		interschimbare(&vect[1],&vect[n]);
		n--;
		maxHeapify(vect,n,1);
	}
}

void buildMaxHeap(int* vect, int n)
{
	for (int i=n/2;i>=1;i--)
	{
		maxHeapify(vect,n,i);
	}
}

void maxHeapify(int* vect, int n, int i)
{
	int largest = i;
	int left = i<<1;
	int right = left|1;

	if (left <=n && vect[left] > vect[largest])
	{
		largest = left;
	}
	if (right <=n && vect[right] > vect[largest])
	{
		largest = right;
	}

	if (largest != i)
	{
		interschimbare(&vect[i],&vect[largest]);
		maxHeapify(vect,n,largest);
	}
}

void interschimbare(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}