Cod sursa(job #2664019)

Utilizator vali_27Bojici Valentin vali_27 Data 27 octombrie 2020 19:33:19
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>
#define NMAX 200001

std::ifstream f("algsort.in");
std::ofstream g("algsort.out");

int v[NMAX], n;

void upheap(int node)
{
	while (node > 0 && v[node] > v[(node-1)/2])
	{
		std::swap(v[node], v[(node - 1) / 2]);
		node = (node - 1) / 2;
	}
}

int getIdxMax(int node, int size)
{
	if (node * 2 + 2 < size)
		return v[node * 2 + 1] >= v[node * 2 + 2] ? node * 2 + 1 : node * 2 + 2;
	return node * 2 + 1;
}

void downheap(int node, int size)
{
	while (node < size / 2)
	{
		int idxMax = getIdxMax(node, size);
		if (v[node] < v[idxMax])
		{
			std::swap(v[node], v[idxMax]);
			node = idxMax;
		}
		else return;
	}
}

void heapify()
{
	for (int i = n/2-1;i>=0;--i)
		downheap(i,n);
}

void heapsort()
{
	heapify();
	
	for (int i = n-1; i > 0; --i)
	{
		std::swap(v[0], v[i]);
		downheap(0, i);
	}
}

void citire()
{
	f >> n;
	for (int i = 0; i < n; ++i)
		f >> v[i];
}

int main() {
	citire();
	heapsort();
	for (int i = 0; i < n; ++i)
		g << v[i] << ' ';
}