Cod sursa(job #1275890)

Utilizator fhandreiAndrei Hareza fhandrei Data 25 noiembrie 2014 18:55:12
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
// FMI - Grupa 135 - Semigrupa 2 - Hareza Andrei
// Include
#include <fstream>
#include <cstdlib>
using namespace std;

// Clase
template<class T> class skipList;
template<class U> class skipListNode
{
	skipListNode<U> *down, *right;
	U value;
	
	skipListNode()
	{
		down = right = '\0';
		value = -1;
	}
	
	template<class T> friend class skipList;
};

template<class T> class skipList
{
	skipListNode<T> *start;
	int currentHeight;
	
public:
	skipList()
	{
		srand(1951031);
		
		start = new skipListNode<T>;
		currentHeight = 1;
	}
	
	void insert(T value)
	{
		int h = 1;
		while(rand() & 1)
			++h;
		
		if(currentHeight < h)
		{
			skipListNode<T> *temp = new skipListNode<T>;
			temp->down = start;
			start = temp;
			++currentHeight;
		}
		
		skipListNode<T> *current = start, *lastAdded='\0';
		
		int currentLevel = currentHeight;
		while(current)
		{
			while(current->right && current->right->value < value)
				current = current->right;
			
			if(currentLevel <= h)
			{
				if(lastAdded)
				{
					lastAdded->down = new skipListNode<T>;
					lastAdded = lastAdded->down;
					lastAdded->value = value;
				}
				else
				{
					lastAdded = new skipListNode<T>;
					lastAdded->value = value;
				}
				lastAdded->right = current->right;
				current->right = lastAdded;
			}
			current = current->down;
			--currentLevel;
		}
	}
	
	void printSorted(ostream &file)
	{
		skipListNode<T> *current = start;
		while(current->down)
			current = current->down;
		while(current->right)
		{
			file << (current = current->right)->value << ' ';
		}
	}
};

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

int num;
skipList<int> sl;

// Main
int main()
{
	in >> num;
	int value;
	while(num--)
	{
		in >> value;
		sl.insert(value);
	}
	
	sl.printSorted(out);
	out << '\n';
	
	in.close();
	out.close();
	return 0;
}