Pagini recente » Cod sursa (job #2932008) | Cod sursa (job #2741655) | Cod sursa (job #2480576) | Cod sursa (job #2638003) | Cod sursa (job #2555221)
#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;
}