-
Priority Queue using Linked Heap자료구조 2023. 7. 4. 18:29
2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152#include <iostream>#include <string>#define endl '\n'using namespace std;class Node{private:Node *parent, *left, *right;int elem;public:Node() = delete;Node(int elem) : elem{elem} { parent = left = right = nullptr; }~Node() = default;friend class Heap;};class Heap{private:Node *root, *last;int n; // sizevoid release(Node* node);void upheap(Node* node);void downheap(Node* node);void swap_element(Node* u, Node* v);public:Heap() : n{0} { root = last = nullptr; }~Heap() { if(root != nullptr) release(root); }int size() const { return n; }bool empty() const { return n == 0; }int top() const;void push(int x);int pop();};int main(){ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int N; cin >> N;Heap hp{};for(int i = 0; i < N; i++){int tmp; cin >> tmp;hp.push(tmp);}for(int i = 0; i < N; i++){cout << hp.pop() << endl;}return 0;}void Heap::downheap(Node* node){while(node->left != nullptr){Node* nxt = node->left;if(node->right != nullptr && node->left->elem > node->right->elem) nxt = node->right;if(node->elem < nxt->elem) break;else{swap_element(node, nxt);node = nxt;}}}void Heap::swap_element(Node* u, Node* v){int tmp = v->elem;v->elem = u->elem;u->elem = tmp;}void Heap::upheap(Node* node){while(node->parent != nullptr){if(node->parent->elem > node->elem){swap_element(node, node->parent);node = node->parent;}else break;}}void Heap::release(Node* node){if(node->left != nullptr) release(node->left);if(node->right != nullptr) release(node->right);delete node; node = nullptr;}int Heap::top() const{if(empty()) throw "empty";return root->elem;}void Heap::push(int x){Node* node = new Node{x};if(empty()) root = last = node;else{while(last->parent != nullptr && last->parent->left != last)last = last->parent;if(last->parent != nullptr && last->parent->right == nullptr){node->parent = last->parent;last->parent->right = node;}else{if(last->parent != nullptr) last = last->parent->right;while(last->left != nullptr) last = last->left;last->left = node;node->parent = last;}last = node;upheap(last);}n += 1;}int Heap::pop(){if(empty()) throw "empty";int ret = root->elem;swap_element(root, last);Node*rm = last;if(rm->parent == nullptr){root = last = nullptr;}else{while(last->parent != nullptr && last->parent->right != last) last = last->parent;if(last->parent != nullptr && last->parent->left != nullptr) last = last->parent->left;while(last->right != nullptr) last = last->right;if(rm->parent->left == rm) rm->parent->left = nullptr;else rm->parent->right = nullptr;downheap(root);}n -= 1;delete rm; rm = nullptr;return ret;}cs'자료구조' 카테고리의 다른 글
대학교에서 배운 자료구조 (0) 2023.07.14 Priority Queue using array based Heap (0) 2023.07.14 AVL tree (0) 2023.07.14 Linked-structure binary search tree(BST) (0) 2023.07.05