Pagini recente » Cod sursa (job #41649) | Cod sursa (job #3164865) | Cod sursa (job #1922906) | Cod sursa (job #2274433) | Cod sursa (job #470914)
Cod sursa(job #470914)
//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;
}