Cod sursa(job #2555221)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 23 februarie 2020 20:03:30
Problema Sortare prin comparare Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define pii pair <int,int>
#define mp make_pair
#define pb push_back
#define x first
#define y second

using namespace std;

class Node{

public:
	int key;
	Node **forward;

	Node(int K, int lvl){

		key = K;
		forward = new Node*[lvl + 5];
		memset(forward, 0, sizeof(Node*) * (lvl + 5));
	}
};

class SkipList{

private:
	int max_lvl, lvl;
	ld p;
	Node *header;

public:
	SkipList(int M, ld P){

		p = P;
		max_lvl = M;
		lvl = 0;
		header = new Node(-1, M);
	}

	int randomlvl(){

		srand(time(nullptr));
		ld r = (ld)rand() / RAND_MAX;
		int level;
		for(level = 0; r < p and level < max_lvl; ++level)
			r = (ld)rand() / RAND_MAX;
		return level;
	}

	Node* create_node(int key, int level){

		Node *temp = new Node(key, level);
		return temp;
	}

	void insert(int x){

		Node* curr_node = header;
		Node* update[max_lvl + 5];
		memset(update, 0, sizeof(Node*) * (max_lvl + 5));

		for(int i = lvl; i >= 0; --i){

			while(curr_node -> forward[i] and curr_node -> forward[i] -> key < x)
				curr_node = curr_node -> forward[i];
			update[i] = curr_node;
		}
		curr_node = curr_node -> forward[0];

		int new_lvl = randomlvl();
		if(new_lvl > lvl){

			for(int i = lvl + 1; i <= new_lvl; ++i)
				update[i] = header;
			lvl = new_lvl;
		}

		Node* temp = create_node(x, new_lvl);
		for(int i = 0; i <= new_lvl; ++i){

			temp -> forward[i] = update[i] -> forward[i];
			update[i] -> forward[i] = temp;
		}
	}

	void display(){

		for(Node* curr_node = header -> forward[0]; curr_node; curr_node = curr_node -> forward[0])
			cout << curr_node -> key << ' ';
	}
};

int main(){

    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr);
    freopen("algsort.in", "r", stdin);
    freopen("algsort.out", "w", stdout);

    int n;
    cin >> n;
    SkipList S(1 + log2(n), 0.5);

    for(int x, i = 1; i <= n; ++i){

    	cin >> x;
    	S.insert(x);
    }

    S.display();

    return 0;
}