#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 힙 정렬
void HeapSort(vector<int>& v)
{
priority_queue<int, vector<int>, greater<int>> pq;
for (int num : v)
pq.push(num);
v.clear();
while (pq.empty() == false)
{
v.push_back(pq.top());
pq.pop();
}
}
// 병합 정렬
// 분할 정복 (Divide and Conquer)
// - 분할 (Divide) 문제를 더 단순하게 분할한다
// - 정복 (Conquer) 분할된 문제를 해결
// - 결합 (Combine) 결과를 취합하여 마무리
void MergeResult(vector<int>& v, int left, int mid, int right)
{
int leftIdx = left;
int rightIdx = mid + 1;
vector<int> temp;
while (leftIdx <= mid && rightIdx <= right)
{
if (v[leftIdx] <= v[rightIdx])
{
temp.push_back(v[leftIdx]);
leftIdx++;
}
else
{
temp.push_back(v[rightIdx]);
rightIdx++;
}
}
// 왼쪽이 먼저 끝났으면, 오른쪽 나머지 데이터 복사
if (leftIdx > mid)
{
while (rightIdx <= right)
{
temp.push_back(v[rightIdx]);
rightIdx++;
}
}
else
{
while (leftIdx <= mid)
{
temp.push_back(v[leftIdx]);
leftIdx++;
}
}
for (int i = 0; i < temp.size(); i++)
v[left + i] = temp[i];
}
void MergeSort(vector<int>& v, int left, int right)
{
if (left >= right)
return;
int mid = (left + right) / 2;
MergeSort(v, left, mid);
MergeSort(v, mid + 1, right);
MergeResult(v, left, mid, right);
}
vector<int> Merge(vector<int> a, vector<int> b)
{
int leftIdx = 0;
int rightIdx = 0;
vector<int> temp;
while (leftIdx <= a.size() - 1 && rightIdx <= b.size() - 1)
{
if (a[leftIdx] <= b[rightIdx])
{
temp.push_back(a[leftIdx]);
leftIdx++;
}
else
{
temp.push_back(b[rightIdx]);
rightIdx++;
}
}
// 한쪽 인덱스를 다 쓴 경우 나머지 복사
if (leftIdx > a.size() - 1)
{
while (rightIdx <= b.size() - 1)
{
temp.push_back(b[rightIdx]);
rightIdx++;
}
}
else
{
while (leftIdx <= a.size() - 1)
{
temp.push_back(a[leftIdx]);
leftIdx++;
}
}
return temp;
}
int main()
{
vector<int> v{ 1, 5, 3, 4, 2 };
vector<int> w{ 10, 32, 45, 51, 70 };
vector<int> x{ 12, 23, 42, 47, 63, 65, 80 };
MergeSort(v, 0, v.size() - 1);
for (int i : v)
cout << i << endl;
cout << endl;
auto result = Merge(w, x);
for (int i : result)
cout << i << endl;
}