๋ณํฉ ์ ๋ ฌ (Merge Sort)
ํต์ฌ ์์
โข
๋ถํ (Divide): ์
๋ ฅ ๋ฐฐ์ด์ ๊ฐ์ ํฌ๊ธฐ์ 2๊ฐ์ ๋ถ๋ถ ๋ฐฐ์ด๋ก ๋ถํ
โข
์ ๋ณต(Conquer): ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌ
โข
๊ฒฐํฉ(Combine): ์ ๋ ฌ๋ ๋ถ๋ถ ๋ฐฐ์ด๋ค์ ํ๋์ ๋ฐฐ์ด๋ก ๋ณํฉ
์๊ฐ ๋ณต์ก๋
์ต์ ์ ๊ฒฝ์ฐ | O(n log n) |
ํ๊ท ์ ๊ฒฝ์ฐ | O(n log n) |
์ต์
์ ๊ฒฝ์ฐ | O(n log n) |
๊ณต๊ฐ ๋ณต์ก๋ | O(n) |
์ฃผ์ ํน์ง
โข
์์ ์ ๋ ฌ(Stable Sort): ๋์ผํ ๊ฐ์ ๋ํด ์๋์ ์์๊ฐ ์ ์ง๋จ
โข
๋น์ ์๋ฆฌ ์ ๋ ฌ(Not-in-place Sort): ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์
โข
๋ถํ ์ ๋ณต ๋ฐฉ์: ๋ฌธ์ ๋ฅผ ์์ 2๊ฐ์ ๋ฌธ์ ๋ก ๋ถ๋ฆฌํ๊ณ ํด๊ฒฐํ ํ, ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์์ ์๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
์์ ์ฝ๋
public class MergeSort {
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
private static void merge(int[] arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int[] L = new int[n1];
int[] R = new int[n2];
for (int i = 0; i < n1; i++)
L[i] = arr[left + i];
for (int j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90};
mergeSort(arr);
System.out.println(Arrays.toString(arr));
}
}
Java
๋ณต์ฌ
์๋ฐ ์ปฌ๋ ์ ์ผ๋ก ๊ตฌํ
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
public class MergeSortCollection {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(64, 34, 25, 12, 22, 11, 90));
// Collections.sort() ๋ด๋ถ์ ์ผ๋ก ๋ณํฉ ์ ๋ ฌ ์ฌ์ฉ
Collections.sort(list);
System.out.println("์ ๋ ฌ๋ ๋ฆฌ์คํธ: " + list);
// Arrays.sort()๋ ๋ณํฉ ์ ๋ ฌ ๊ธฐ๋ฐ
Integer[] array = list.toArray(new Integer[0]);
Arrays.sort(array);
System.out.println("์ ๋ ฌ๋ ๋ฐฐ์ด: " + Arrays.toString(array));
}
}
Java
๋ณต์ฌ
ํฉ๋ณ ์ ๋ ฌ(Merge Sort) ์ ์
ํฉ๋ณ ์ ๋ ฌ(Merge Sort)์ ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ผ์ข
์ผ๋ก, ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋์ด ๊ฐ๊ฐ์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌํ ํ, ์ ๋ ฌ๋ ๋ ๋ฐฐ์ด์ ๋ณํฉ(merge)ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ ๋ ฌ์ ์ํ๋ฉฐ, ์๊ฐ ๋ณต์ก๋๊ฐ O(n log n)์ผ๋ก ํจ์จ์ ์ธ ์ ๋ ฌ ๋ฐฉ๋ฒ์
๋๋ค.
ํฉ๋ณ ์ ๋ ฌ์ ๋์ ๊ณผ์ ์ ํฌ๊ฒ ๋ ๋จ๊ณ๋ก ๋๋ ์ ์์ต๋๋ค:
1.
๋ถํ : ๋ฐฐ์ด์ ์ค๊ฐ์์ ๊ณ์ ๋๋์ด๊ฐ๋ฉฐ ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ง๋ ๋ค.
2.
๋ณํฉ: ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด์ ์ ๋ ฌํ์ฌ ํ๋์ ์ ๋ ฌ๋ ๋ฐฐ์ด๋ก ๋ณํฉํ๋ค.
ํฉ๋ณ ์ ๋ ฌ ์์๋
1.
๋ฐฐ์ด ๋ถํ :
โข
์ฃผ์ด์ง ๋ฐฐ์ด์ ๊ณ์ํด์ ๋ฐ์ผ๋ก ๋๋๋ค. ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด์ด ํฌ๊ธฐ๊ฐ 1์ด ๋ ๋๊น์ง ๋ถํ ์ ๊ณ์ํ๋ค.
2.
๋ฐฐ์ด ๋ณํฉ:
โข
๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ํฉ์ณ์ ํ๋์ ์ ๋ ฌ๋ ๋ฐฐ์ด๋ก ๋ง๋ ๋ค.
ํฉ๋ณ ์ ๋ ฌ์ ์์๋
graph TD A["์์ [๋ฐฐ์ด]"] B["๋ฐฐ์ด์ ๋ ๋ถ๋ถ์ผ๋ก ๋ถํ "] C1["์ผ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด"] C2["์ค๋ฅธ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด"] D1["์ผ์ชฝ ๋ฐฐ์ด ์ ๋ ฌ"] D2["์ค๋ฅธ์ชฝ ๋ฐฐ์ด ์ ๋ ฌ"] E["์ ๋ ฌ๋ ๋ ๋ฐฐ์ด ๋ณํฉ"] F["์ ๋ ฌ ์๋ฃ"] A --> B B --> C1 B --> C2 C1 --> D1 C2 --> D2 D1 --> E D2 --> E E --> F %% ์ค๋ช ์ถ๊ฐ style A fill:#f9f,stroke:#333 style F fill:#9ff,stroke:#333 style E fill:#ff9,stroke:#333
Mermaid
๋ณต์ฌ
์ ์์๋๋ ๋ณํฉ ์ ๋ ฌ์ ๊ธฐ๋ณธ์ ์ธ ํ๋ฆ์ ๋ณด์ฌ์ค๋๋ค. ๋ฐฐ์ด์ ๋ถํ ํ๊ณ , ๊ฐ ๋ถ๋ถ์ ์ ๋ ฌํ ํ, ๋ค์ ๋ณํฉํ๋ ๊ณผ์ ์ ๋ํ๋
๋๋ค.
์ด ์์๋๋ ๋ฐฐ์ด์ ์ฌ๊ท์ ์ผ๋ก ๋ถํ ํ๊ณ ๋ณํฉํ์ฌ ์ ๋ ฌํ๋ ๊ณผ์ ์ ์๊ฐ์ ์ผ๋ก ๋ํ๋ธ ๊ฒ์
๋๋ค.
์ฌ๊ทํธ์ถ ์คํ ์์
mergeSort(arr, 0, 7)
โโ mergeSort(arr, 0, 3)
โ โโ mergeSort(arr, 0, 1)
โ โ โโ mergeSort(arr, 0, 0) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ mergeSort(arr, 1, 1) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ merge(arr, 0, 0, 1) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ โ
โ โโ mergeSort(arr, 2, 3)
โ โ โโ mergeSort(arr, 2, 2) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ mergeSort(arr, 3, 3) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ merge(arr, 2, 2, 3) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ โ
โ โโ merge(arr, 0, 1, 3) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ
โโ mergeSort(arr, 4, 7)
โ โโ mergeSort(arr, 4, 5)
โ โ โโ mergeSort(arr, 4, 4) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ mergeSort(arr, 5, 5) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ merge(arr, 4, 4, 5) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ โ
โ โโ mergeSort(arr, 6, 7)
โ โ โโ mergeSort(arr, 6, 6) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ mergeSort(arr, 7, 7) โ (๊ธฐ์ ์กฐ๊ฑด ์ถฉ์กฑ, ๋ฆฌํด)
โ โ โโ merge(arr, 6, 6, 7) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ โ
โ โโ merge(arr, 4, 5, 7) โ ๋ ๊ฐ์ ์ ๋ ฌ๋ ๋ฐฐ์ด ๋ณํฉ
โ
โโ merge(arr, 0, 3, 7) โ ์ต์ข
์ ์ผ๋ก ๋ชจ๋ ๋ถ๋ถ์ ๋ณํฉ
Java
๋ณต์ฌ
์คํ ์์๋๋ก ๋ถํ ๋ฐ ๋ณํฉ ๊ณผ์ (Merge Sort ๊ณผ์ ์๋ฎฌ๋ ์ด์ )
๋ณํฉ ์ ๋ ฌ์ "๋ถํ (Divide)" ํ "๋ณํฉ (Merge)" ๊ณผ์ ์ด ์งํ๋ฉ๋๋ค.
์๋ ํ์์๋ ๋ถํ ๊ณผ ๋ณํฉ์ ๋์์ ์คํ ์์๋๋ก ์ ๋ฆฌํ์ต๋๋ค.
1. ์ด๊ธฐ ๋ฐฐ์ด
{45, 12, 89, 33, 76, 27, 8, 19}
Plain Text
๋ณต์ฌ
2. ๋ถํ & ๋ณํฉ ๊ณผ์
๋จ๊ณ | ๋ถํ (Divide) | ๋ณํฉ (Merge) |
โ | {45, 12, 89, 33} {76, 27, 8, 19} | |
โก | {45, 12} {89, 33} {76, 27} {8, 19} | |
โข | {45} {12} {89} {33} {76} {27} {8} {19} | |
โฃ | {12, 45} {33, 89} {27, 76} {8, 19} | |
โค | {12, 33, 45, 89} {8, 19, 27, 76} | |
โฅ | {8, 12, 19, 27, 33, 45, 76, 89}
(์ต์ข
์ ๋ ฌ ์๋ฃ) |
3. ๊ณผ์ ์์ธ ์๊ฐํ
์ด๊ธฐ ์ํ: {45, 12, 89, 33, 76, 27, 8, 19}
1. ๋ถํ : {45, 12, 89, 33} | {76, 27, 8, 19}
2. ๋ถํ : {45, 12} | {89, 33} | {76, 27} | {8, 19}
3. ๋ถํ : {45} {12} | {89} {33} | {76} {27} | {8} {19}
----------------------------------------------------
4. ๋ณํฉ: {12, 45} | {33, 89} | {27, 76} | {8, 19}
5. ๋ณํฉ: {12, 33, 45, 89} | {8, 19, 27, 76}
6. ๋ณํฉ: {8, 12, 19, 27, 33, 45, 76, 89} (์ต์ข
์ ๋ ฌ ์๋ฃ)
Plain Text
๋ณต์ฌ
4. ์ต์ข ๊ฒฐ๊ณผ
{8, 12, 19, 27, 33, 45, 76, 89}
Plain Text
๋ณต์ฌ
์ด์ฒ๋ผ ๋ณํฉ ์ ๋ ฌ์ ๋ถํ (Divide) โ ์ ๋ ฌ ๋ฐ ๋ณํฉ(Merge) ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง๋๋ค.