● 코드
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
using ll = long long;
using ii = pair<int, int>;
vector<int>arr(1000000);
vector<int>temp(1000000);
void mergesort(int start, int end); // 분할
void merge(int start, int mid, int end); // 정복
int main()
{
// 입력
int N;
cin >> N;
for (int i = 0; i < N; i++)
cin >> arr[i];
// 병합 정렬
mergesort(0, N - 1);
// 출력
for (int i = 0; i < N; i++)
cout << arr[i] << "\n";
return 0;
}
void mergesort(int start, int end)
{
if (start < end)
{
int mid = (start + end) / 2;
mergesort(start, mid);
mergesort(mid + 1, end);
merge(start, mid, end);
}
}
void merge(int start, int mid, int end)
{
for (int i = start; i <= end; i++)
temp[i] = arr[i];
int left = start;
int right = mid + 1;
int idx = start;
while (left <= mid && right <= end)
{
if (temp[left] < temp[right])
arr[idx++] = temp[left++];
else
arr[idx++] = temp[right++];
}
if (left <= mid)
{
for (int i = left; i <= mid; i++)
arr[idx++] = temp[i];
}
else
{
for (int i = right; i <= end; i++)
arr[idx++] = temp[i];
}
}
● 결과 화면
● 시간복잡도 : O(N long N)
● BOJ 문제 : 수 정렬하기 2
'공부 > 알고리즘' 카테고리의 다른 글
확장 유클리드 호제법 (Extended Euclidean Algorithm) (1) | 2023.02.16 |
---|---|
백트래킹 (Backtracking) (0) | 2022.07.10 |
카운팅 정렬 (Counting Sort) (0) | 2022.07.09 |
삽입 정렬 (Insertion Sort) (0) | 2022.07.08 |
버블 정렬 (Bubble Sort) (0) | 2022.07.08 |