Cod sursa(job #586976)

Utilizator blustudioPaul Herman blustudio Data 3 mai 2011 17:50:56
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
using namespace std;

unsigned long long int v[500001];
unsigned long long int n;

void read()
{
	ifstream fin("algsort.in");
	fin >> n;
	for(unsigned long long int i=1; i<=n; i++)
	{
		fin >> v[i];
	}
	fin.close();
}
void write()
{
	ofstream fout("algsort.out");
	for(unsigned long long int i=1; i<=n; i++)
	{
		fout << v[i] << " ";
	}
	fout.close();
}
void heapsort()
{
	unsigned long long int begin = 1;
	unsigned long long int end = n;
	unsigned long long heap_size = end;
	unsigned long long int temp, left, right, largest, k;
	for(unsigned long long int i=heap_size/2; i>begin-1; i--)
	{
		largest = i;
		do {
			k = largest;
			left = 2*k;
			right = left+1;
			if(left <= heap_size && v[left] > v[k])
				largest = left;
			else
				largest = k;
			if(right <= heap_size && v[right] > v[k])
				largest = right;
			if(k != largest)
			{
				temp = v[largest];
				v[largest] = v[k];
				v[k] = temp;
			}
		} while(largest != k);
	}
	for(unsigned long long int i=heap_size; i>begin; i--)
	{
		temp = v[1];
		v[1] = v[heap_size];
		v[heap_size] = temp;
		heap_size--;
		largest = 1;
		do {
			k = largest;
			left = 2*k;
			right = left+1;
			if(left <= heap_size && v[left] > v[k])
				largest = left;
			else
				largest = k;
			if(right <= heap_size && v[right] > v[k])
				largest = right;
			if(k != largest)
			{
				temp = v[largest];
				v[largest] = v[k];
				v[k] = temp;
			}
		} while(largest != k);	
	}	
}
int main()
{
	read();
	heapsort();
	write();
	return 0;
}