Cod sursa(job #1459948)

Utilizator adi_ispas95FMI - Adrian Ispas adi_ispas95 Data 11 iulie 2015 12:52:26
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

using namespace std;

inline int Parent(int i){
	return i / 2;
}

inline int Left(int i){
	return 2 * i;
}

inline int Right(int i){
	return 2 * i + 1;
}

inline void Interschimba(int &a, int &b){
	int c;

	c = a;
	a = b;
	b = c;
}

void MaxHeapify(int *a, int i, int n){

	int r, l, largest;

	l = Left(i);
	r = Right(i);

	if (l <= n && a[l] > a[i])
		largest = l;
	else
		largest = i;

	if (r <= n && a[r] > a[largest])
		largest = r;

	if (largest != i){
		Interschimba(a[i], a[largest]);
		MaxHeapify(a, largest, n);
	}
}

void BuildMaxHeap(int *a, int n){

	for (int i = n / 2; i >= 1; i--)
		MaxHeapify(a, i, n);
}

void HeapSort(int *a, int n){

	int heapSize = n;

	BuildMaxHeap(a, n);

	for (int i = n; i >= 2; i--){
		Interschimba(a[1], a[i]);
		heapSize--;
		MaxHeapify(a, 1, heapSize);
	}
}

int main(){

	ifstream in("algsort.in");
	ofstream out("algsort.out");

	const int NMAX = 500005;
	int n, *a = new int[NMAX];

	in >> n;

	for (int i = 1; i <= n; i++)
		in >> a[i];

	HeapSort(a, n);

	for (int i = 1; i <= n; i++)
		out << a[i] << " ";
	
	delete[]a;
	return 0;
}