알고리즘/백준(BOJ)
백준 2751 수 정렬하기2
오뚜깅
2021. 1. 15. 17:18
반응형
백준 2751 수 정렬하기2 문제는 시간복잡도와 관계가 있는 문제이다.
일반적인 버블 정렬과 삽입 정렬로는 처리 시간이 오래 걸리기 때문에 좀 더 빠른 알고리즘으로 처리해야한다.
그 중에 대표적으로 Heap 정렬이 있다.
아래 코드는 Heap 정렬 코드다.
#include <iostream>
#include <vector>
#include <algorithm>
void push_heap(std::vector<int>& heap, int Value) {
heap.push_back(Value);
int index = heap.size() - 1;
while (index > 0 && heap[(index - 1) / 2] < heap[index]) {
std::swap(heap[index], heap[(index - 1) / 2]);
index = (index - 1) / 2;
}
}
void pop_heap(std::vector<int>& heap) {
heap[0] = heap.back();
heap.pop_back();
int here = 0;
while (true) {
int left = here * 2 + 1, right = here * 2 + 2;
if (left >= heap.size()) break;
int next = here;
if (heap[next] < heap[left]) next = left;
if (right < heap.size() && heap[next] < heap[right]) next = right;
if (next == here) break;
std::swap(heap[here], heap[next]);
here = next;
}
}
void sort_heap(std::vector<int>& heap) {
for (int count = 1; count < heap.size(); count++) {
std::swap(heap[heap.size() - count], heap[0]);
int here = 0;
while (true) {
int left = here * 2 + 1, right = here * 2 + 2;
if (left >= heap.size() - count) break;
int next = here;
if (heap[next] < heap[left]) next = left;
if (right < heap.size() - count && heap[next] < heap[right]) next = right;
if (next == here) break;
std::swap(heap[here], heap[next]);
here = next;
}
}
}
int main() {
int N;
std::cin >> N;
std::vector<int> heap;
for (int i = 0; i < N; i++) {
int temp;
std::cin >> temp;
push_heap(heap, temp);
}
sort_heap(heap);
for (auto content : heap)
std::cout << content << "\n";
return 0;
}
반응형