# Merge sort
재귀적으로 수열을 나눠 정렬한 후 합치는 정렬법
우선 순위가 같은 원소들끼리 원래 순서가 유지되는 stable sort
#include <bits/stdc++.h>
using namespace std;
int n = 10;
int arr[1000001] = { 15, 25, 22, 357, 16, 23, -53, 12, 46, 3 };
int tmp[1000001]; // merge 함수에서 리스트 2개를 합친 결과를 임시로 저장하고 있을 변수
// mid = (st+en)/2라고 할 때 arr[st:mid], arr[mid:en]은 이미 정렬이 되어있는 상태일 때 arr[st:mid]와 arr[mid:en]을 합친다.
void merge(int st, int en) {
int mid = (st + en) / 2;
int idxL = st, idxR = mid;
for (int i = st; i < en; i++)
{
if (idxR == en) tmp[i] = arr[idxL++];
else if (idxL == mid) tmp[i] = arr[idxR++];
else if (arr[idxL] <= arr[idxR]) tmp[i] = arr[idxL++];
else tmp[i] = arr[idxR++];
}
for (int i = st; i < en; i++) arr[i] = tmp[i];
}
// arr[st:en]을 정렬하고 싶다.
void merge_sort(int st, int en) {
if (en == st + 1) return; // 길이 1인 경우
int mid = (st + en) / 2;
merge_sort(st, mid); // arr[st:mid]을 정렬한다.
merge_sort(mid, en); // arr[mid:en]을 정렬한다.
merge(st, en); // arr[st:mid]와 arr[mid:en]을 합친다.
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
merge_sort(0, n);
for (int i = 0; i < n; i++) cout << arr[i] << ' '; // -53 3 12 15 16 22 23 25 46 357
}
# Quick sort
pivot을 기준으로 양쪽이 나뉘고 양쪽에서 따로 따로 pivot을 제자리로 보내는 것을 반복하는 정렬
평균 O(NlgN)이지만 최악의 경우 O(N^2)
STL이 없을 때 정렬을 직접 짜야 한다면 merge sort를 쓰는 것이 낫다
또는 최악의 경우에도 O(NlgN)이 보장되는 heap sort로 정렬한다
merge sort와 달리 unstable sort
#include <bits/stdc++.h>
using namespace std;
int n = 10;
int arr[1111];
// arr[st ~ en-1] 정렬
void qSort(int st, int en)
{
if (en <= st + 1) return; // base condition = 수열의 길이가 1 이하면 종료
int pivot = arr[st];
int l = st + 1;
int r = en - 1;
while (true)
{
while (l <= r and arr[l] <= pivot) l++;
while (r <= l and arr[r] >= pivot) r--;
if (l < r) break; // l과 r이 역전되는 순간 탈출
swap(arr[l], arr[r]);
}
swap(arr[st], arr[r]); // 역전된 후 pivot을 스왑해주면 pivot이 제자리로 간다
qSort(st, r);
qSort(r + 1, en);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
qSort(0, n);
for (int i = 0; i < n; i++) cout << arr[i] << ' ';
}
# 출처
'Algorithm > 정리' 카테고리의 다른 글
[Data Structure] Time Complexity & Space Complexity (0) | 2022.05.20 |
---|---|
0x10 - DP (0) | 2022.03.02 |
0x02 - 기초 코드 작성 요령2 (0) | 2022.02.15 |
cpp (0) | 2022.02.10 |
0x0C - Backtracking (0) | 2022.01.31 |