Cod sursa(job #470914)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 15 iulie 2010 22:12:03
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
//sortare cu treap

#include <iostream>
#include <fstream>

using namespace std;

const char iname[] = "algsort.in";
const char oname[] = "algsort.out";

ifstream fin(iname);
ofstream fout(oname);

struct treap
{
	int key, priority;
	treap *right;
	treap *left;
};

treap *T, *R, *nil;
int i, j, k, N, x;

void rotLeft(treap *&n)
{
	treap *t = n -> right;
	n -> right = t -> left;
	t -> left = n;
	n = t;
}
	
void rotRight(treap *&n)
{
	treap *t = n -> left;
	n -> left = t -> right;
	t -> right =  n;
	n = t;
}

	
void balance(treap *&n)
{
	if(n -> left -> priority > n -> priority)
		rotRight(n);
	else
		if(n -> right -> priority  > n -> priority)
			rotLeft(n);
}

void insert(treap *&n, int key, int priority)
{
	if(n == nil)
	{
		n = new treap;
		n -> key = key;
		n -> priority = priority;
		n -> right = nil;
		n -> left = nil;
		return;
	}
	if(key < n -> key)
		insert(n -> left, key, priority);
	else
		insert(n -> right, key, priority);
	balance(n);
}

void init()
{
	nil = new treap;
	nil -> priority = -2;
	nil -> key = 0;
	nil -> right = NULL;
	nil -> left = NULL;
}

void parcurgere(treap *x)
{	
	if(x == nil)
		return;
	parcurgere(x -> left);
	fout << x -> key << " ";
	parcurgere(x -> right);
}
	

treap *rad;

int main()
{	
	srand(time(NULL));
	init();
	fin >> N;
	for(i = 1; i <= N; i ++)
	{
		fin >> x;
		
		if(i == 1)
			R = nil;
		insert(R, x, rand() + 1);
	}
	
	parcurgere(R);
	return 0;
}