Pagini recente » Cod sursa (job #284670) | Cod sursa (job #2675633) | Cod sursa (job #1401699) | Cod sursa (job #1566364) | Cod sursa (job #1388984)
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int key, size;
Node *st, *dr;
explicit Node() : key(0), size(0), st(NULL), dr(NULL) {
}
Node(const int k) : key(k), size(1), st(NULL), dr(NULL) {
}
};
void update(Node* &A)
{
A->size = 1;
if (A->st != NULL) A->size += A->st->size;
if (A->dr != NULL) A->size += A->dr->size;
}
Node* join(Node* &A, Node* &B)
{
if (!A) return B;
if (!B) return A;
if (A->key > B->key)
swap(A, B);
Node *aux = A->st;
if (A->st)
{
if (A->dr != NULL && A->dr->size < A->st->size)
swap(A->st, A->dr);
}
A->st = join(A->st, B);
update(A);
return A;
}
int removeMin(Node* &H)
{
int k = H->key;
H = join(H->st, H->dr);
return k;
}
void initHeap(Node* &H)
{
H = NULL;
srand(time(NULL));
}
int main()
{
ifstream in("algsort.in");
ofstream out("algsort.out");
int N, a;
in >> N;
Node *H;
initHeap(H);
for ( int i = 1; i <= N; ++i )
{
in >> a;
Node *n = new Node(a);
H = join(H, n);
}
for ( int i = 1; i <= N; ++i )
out << removeMin(H) << " ";
return 0;
}