- [์๊ณ ๋ฆฌ์ฆ] ํฉ๋ณ์ ๋ ฌ (Merge Sort) (BOJ 2752, C++)2024๋ 12์ 13์ผ
- ํํ
- ์์ฑ์
- 2024.12.13.:44
๐ก ํฉ๋ณ ์ ๋ ฌ(Merge Sort)์ด๋?
ํฉ๋ณ ์ ๋ ฌ(Merge Sort)์ ๋ถํ ์ ๋ณต(divide and conquer) ๋ฐฉ์์ ์ฌ์ฉํ ๋ํ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด์์. ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ก ๋๋๊ณ , ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ฉด์ ๋ค์ ํฉ์น๋ ๊ณผ์ ์ ๋ฐ๋ณตํด ์ ๋ ฌ์ ์์ฑํฉ๋๋ค.
์ฝ๊ฒ ๋งํด, ์๊ฒ ๋๋ ์ ํด๊ฒฐํ ๋ค, ๋ค์ ํฉ์น๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์ดํดํ๋ฉด ๋ฉ๋๋ค.
โจ ํฉ๋ณ ์ ๋ ฌ์ ์๋ฆฌ
ํฉ๋ณ ์ ๋ ฌ์ ๋ค์ ์ธ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ ธ ์์ด์.
1๏ธโฃ ๋ถํ (Divide)
์ ๋ ฌํ ๋ฐฐ์ด์ ๋ ๊ฐ์ ์์ ๋ฐฐ์ด๋ก ๋๋๋๋ค.
์ด ๊ณผ์ ์ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ 1์ด ๋ ๋๊น์ง ๋ฐ๋ณตํด์.2๏ธโฃ ์ ๋ณต(Conquer)
๋๋ ์ง ๋ฐฐ์ด์ ๊ฐ๊ฐ ์ ๋ ฌํฉ๋๋ค.
์ฌ๊ธฐ์ ์ ๋ ฌ์ ์ฌ๊ท์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ๊ฐ ๋ฐฐ์ด์ด ํ๋์ฉ ์ ๋ ฌ๋ ์ํ๋ก ๋ง๋ค์ด์ ธ์.3๏ธโฃ ํฉ๋ณ(Merge)
์ ๋ ฌ๋ ๋ฐฐ์ด ๋ ๊ฐ๋ฅผ ๋น๊ตํ์ฌ ํ๋์ ๋ฐฐ์ด๋ก ํฉ์นฉ๋๋ค.
์ด๋, ๋ ๋ฐฐ์ด์ ๊ฐ์ฅ ์์ ๊ฐ๋ถํฐ ์ฐจ๋ก๋ก ๋น๊ตํ๋ฉฐ ์ ๋ ฌ๋ ์์๋ก ๋ฃ์ด์ค๋๋ค.
๐ ๏ธ ํฉ๋ณ ์ ๋ ฌ์ ๋์ ๊ณผ์ (์์ )
์๋ฅผ ๋ค์ด [8, 4, 7, 2, 5, 1, 6, 3] ๋ฐฐ์ด์ ์ ๋ ฌํ๋ค๊ณ ํด๋ณผ๊ฒ์.
1๏ธโฃ ๋ถํ ๋จ๊ณ
- ๋ฐฐ์ด์ ๊ณ์ ๋ฐ์ผ๋ก ๋๋๋๋ค.
[8, 4, 7, 2, 5, 1, 6, 3] → [8, 4, 7, 2], [5, 1, 6, 3]
→ [8, 4], [7, 2], [5, 1], [6, 3]
→ [8], [4], [7], [2], [5], [1], [6], [3]
2๏ธโฃ ์ ๋ ฌ ํ ํฉ๋ณ ๋จ๊ณ
- ๊ฐ์ฅ ์์ ๋จ์๋ถํฐ ์ฐจ๋ก๋ก ํฉ์น๋ฉฐ ์ ๋ ฌํฉ๋๋ค.
- [8]๊ณผ [4] → [4, 8]
- [7]๊ณผ [2] → [2, 7]
- [5]๊ณผ [1] → [1, 5]
- [6]๊ณผ [3] → [3, 6]
3๏ธโฃ ์ต์ข ์ ๋ ฌ๋ ๋ฐฐ์ด ์์ฑ
- ๋ค์ ์ ๋ ฌ๋ ๋ฐฐ์ด๋ค์ ํฉ์นฉ๋๋ค.
- [4, 8]๊ณผ [2, 7] → [2, 4, 7, 8]
- [1, 5]๊ณผ [3, 6] → [1, 3, 5, 6]
- [2, 4, 7, 8]๊ณผ [1, 3, 5, 6] → [1, 2, 3, 4, 5, 6, 7, 8]
๐ ํฉ๋ณ ์ ๋ ฌ์ ํน์ง
โ ์ฅ์
- ์์ ์ ๋ ฌ: ๋์ผํ ๊ฐ์ ์์๊ฐ ์ ์ง๋ฉ๋๋ค.
- ์๊ฐ ๋ณต์ก๋๊ฐ ์์ ์ : ์ต์ , ํ๊ท , ์ต์ ์ ๊ฒฝ์ฐ ๋ชจ๋ **O(n log n)**์ ๋๋ค.
- ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ ๋ ํจ์จ์ ์ ๋๋ค.
โ ๋จ์
- ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ์: ์์ ๋ฐฐ์ด์ ์ฌ์ฉํด์ผ ํด์ **O(n)**์ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ ๋ ฌ๋ณด๋ค ๋๋ฆด ์ ์์ต๋๋ค.
๋์๋๋ ๋ฌธ์ : https://www.acmicpc.net/problem/2751
ํฉ๋ณ์ ๋ ฌ ์ฝ๋๋ฅผ ์ง์ ์ง๋ณด์์ต๋๋ค.
#include <iostream> using namespace std; void mergesort(int ary[], int left, int right); int main() { int n; cin >> n; int* ary = new int[n]; for (int i = 0; i < n; i++) { cin >> ary[i]; } mergesort(ary, 0, n - 1); for (int i = 0; i < n; i++) cout << ary[i] << '\n'; delete[]ary; return 0; } void mergesort(int ary[], int left, int right) { if (left >= right) return; int mid = (left + right) / 2; mergesort(ary, left, mid); mergesort(ary, mid + 1, right); int n1 = mid - left + 1; int n2 = right - mid; int* leftArr = new int[n1]; int* rightArr = new int[n2]; for (int i = 0; i < n1; i++) leftArr[i] = ary[left + i]; for (int i = 0; i < n2; i++) rightArr[i] = ary[mid + 1 + i]; int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (leftArr[i] <= rightArr[j]) ary[k++] = leftArr[i++]; else ary[k++] = rightArr[j++]; } while (i < n1) ary[k++] = leftArr[i++]; while (j < n2) ary[k++] = rightArr[j++]; delete[]leftArr; delete[]rightArr; }
'Data structure & Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ํต์ ๋ ฌ (Quick Sort) (BOJ 2750, C++) (0) 2024.12.14 [์ ๋ฆฌ] ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ๋ํ ๊ฐ์ธ์ ์ธ ์๊ฐ(๋ฐฑ์ค 1920, C++) (0) 2024.11.23 [์๊ณ ๋ฆฌ์ฆ] ๋ฒ๋ธ์ ๋ ฌ (Bubble sort) (0) 2024.11.22 [์๊ณ ๋ฆฌ์ฆ] ์ฝ์ ์ ๋ ฌ (insertion sort) (0) 2024.11.21 [์๊ณ ๋ฆฌ์ฆ] ์ ํ์ ๋ ฌ (selection sort) (0) 2024.11.20 ๋ค์๊ธ์ด์ ๊ธ์ด์ ๊ธ์ด ์์ต๋๋ค.๋๊ธ