Search

๋ณ‘ํ•ฉ ์ •๋ ฌ

๋ณ‘ํ•ฉ ์ •๋ ฌ (Merge Sort)

๋ถ„ํ•  ์ •๋ณต(Divide and Conquer) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ •๋ ฌ ๋ฐฉ์‹์œผ๋กœ, ๋ฆฌ์ŠคํŠธ๋ฅผ ์ ˆ๋ฐ˜์”ฉ ๋‚˜๋ˆ„์–ด ์ •๋ ฌํ•œ ํ›„ ๋‹ค์‹œ ํ•ฉ์น˜๋ฉด์„œ ์ „์ฒด๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ•ต์‹ฌ ์š”์†Œ

โ€ข
๋ถ„ํ• (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) ๋‹จ๊ณ„๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ •๋ ฌ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.