Cod sursa(job #1708014)

Utilizator srefan1Oncioiu Stefan srefan1 Data 26 mai 2016 12:31:46
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 kb
#include<iostream>
#include<fstream>
#include<vector>

using namespace::std;
ofstream fout("algsort.out");
int N;

template<class T>
class Coada
{
private:
	vector<T> co;
	void shiftDown(int x, int y);
	void shiftUp(int x, int y);
	void creare_heap();
public:
Coada();
Coada(vector<T> &);
void push(T );
void afis();
void Heapsort();
};

template<class T>Coada<T>::Coada(){ }

template<class T>Coada<T>::Coada(vector <T> &v)
{
	if (v.size() > 0)
	{
		co = v;
		creare_heap();
	}
}

template < class T > void Coada<T>::push(T val)
{
	co.push_back(val);
	shiftUp(0, co.size() - 1);
}

template<class T> void Coada<T>::shiftUp(int prim, int ultim)
{
	int parent;
	int child = ultim;
	while (child > prim)
	{
		parent = (child - 1) / 2;
		if (co[child] > co[parent])
		{
			T aux;
			aux = co[child];
			co[child] = co[parent];
			co[parent] = aux;

			child = parent;
		}
		else
			break;
	}

}

template<class T> void Coada<T>::shiftDown(int prim, int ultim)
{
	int root = prim;
	while ((root * 2 / 1) + 1 <= ultim)
	{
		int left = (root * 2) + 1;
		int right = left + 1;
		int aux = root;
		if (co[aux] < co[left])
			aux = left;
		if ((right <= ultim) && (co[aux] < co[right]))
			aux = right;
		if (aux != root)
		{
			T aux1 = co[root];
			co[root] = co[aux];
			co[aux] = aux1;

			root = aux;
		}
		else
			break;
	}
}

template<class T> void Coada<T>::creare_heap()
{
	int i;
	int sizee = co.size();
	for (i = (sizee - 1) / 2; i >= 0; --i)
		shiftDown(i, sizee - 1);
}


template<class T> void Coada<T>::Heapsort()
{
	int i;
	T temp;
	for (i = co.size() - 1; i >= 1; i--)
	{
		temp = co[0];
		co[0] = co[i];
		co[i] = temp;
		shiftDown(0, i - 1);
	}
}


template<class T>void Coada<T>::afis()
{
	int i;
	int size1 = co.size();
	if (size1 < 1)
	{
		cout << "coada este vida" << endl;
		return;
	}
	for (i = 0; i < size1; i++)
		fout <<co[i]<<" ";

}



int main(){

	ifstream fin("algsort.in");

	int x;
	Coada<int> C;
	
	fin>> N;
	while (fin >> x)
		C.push(x);
	C.Heapsort();


	C.afis();
	return 0;
}