λ°˜μ‘ν˜•

🧩 병합 μ •λ ¬ (Merge Sort) – 항상 μ•ˆμ •μ μΈ λΆ„ν•  정볡 μ •λ ¬

1. κ°œλ…

병합 정렬은 λΆ„ν•  정볡(Divide and Conquer) μ•Œκ³ λ¦¬μ¦˜μ˜ λŒ€ν‘œ μ˜ˆμ‹œμ΄λ‹€.
배열을 반으둜 λ‚˜λˆ„κ³ , λ‚˜λˆˆ 배열을 각각 μ •λ ¬ν•œ ν›„, 두 μ •λ ¬λœ 배열을 **병합(merge)**ν•˜μ—¬ μ΅œμ’… μ •λ ¬λœ 배열을 λ§Œλ“ λ‹€.


2. μž‘λ™ 방식 μš”μ•½

  1. 배열을 반으둜 λΆ„ν• 
  2. 각각을 μž¬κ·€μ μœΌλ‘œ 병합 μ •λ ¬
  3. 두 μ •λ ¬λœ 배열을 μ •λ ¬λœ μƒνƒœλ‘œ 병합
  4. 더 이상 λ‚˜λˆŒ 수 없을 λ•ŒκΉŒμ§€ 반볡

3. C# 예제 μ½”λ“œ (μƒˆλ‘œμš΄ μ˜ˆμ‹œ)

void MergeSort(int[] arr, int left, int right)
{
    if (left >= right) return;

    int mid = (left + right) / 2;

    MergeSort(arr, left, mid);
    MergeSort(arr, mid + 1, right);
    Merge(arr, left, mid, right);
}

void Merge(int[] arr, int left, int mid, int right)
{
    int[] temp = new int[right - left + 1];

    int i = left;
    int j = mid + 1;
    int k = 0;

    while (i <= mid && j <= right)
    {
        if (arr[i] <= arr[j])
            temp[k++] = arr[i++];
        else
            temp[k++] = arr[j++];
    }

    while (i <= mid)
        temp[k++] = arr[i++];
    while (j <= right)
        temp[k++] = arr[j++];

    // μ›λž˜ 배열에 볡사
    for (int t = 0; t < temp.Length; t++)
        arr[left + t] = temp[t];
}

βœ… μ‚¬μš© 예:

int[] data = { 6, 2, 9, 1, 5 };
MergeSort(data, 0, data.Length - 1);

4. μ‹œκ°„/곡간 λ³΅μž‘λ„

경우 μ‹œκ°„ λ³΅μž‘λ„
평균 O(n log n)
μ΅œμ•… O(n log n)

 

  • 곡간 λ³΅μž‘λ„: O(n)
    → 정렬을 μœ„ν•΄ μž„μ‹œ 배열이 ν•„μš”ν•¨

5. νŠΉμ§•

  • 항상 μ•ˆμ •μ μΈ μ‹œκ°„ λ³΅μž‘λ„ O(n log n)
  • μ•ˆμ • μ •λ ¬ (동일 κ°’μ˜ μˆœμ„œ 보쑴)
  • μΆ”κ°€ λ©”λͺ¨λ¦¬ 곡간 ν•„μš” (In-place μ•„λ‹˜)
  • 큰 데이터, μ•ˆμ •μ„±μ΄ μ€‘μš”ν•œ κ²½μš°μ— 적합

6. μ˜ˆμ‹œ

[4, 1, 3, 2]
→ λ‚˜λˆ„κΈ°: [4, 1] / [3, 2]
→ μ •λ ¬: [1, 4] / [2, 3]
→ 병합: [1, 2, 3, 4]

7. 마무리 μš”μ•½

  • 병합 정렬은 μ‹œκ°„ λ³΅μž‘λ„κ°€ 항상 O(n log n)으둜 예츑 κ°€λŠ₯ν•˜μ—¬ 신뒰도가 λ†’λ‹€.
  • 퀡 정렬보닀 느릴 수 μžˆμ§€λ§Œ, 데이터가 μ •λ ¬λœ μƒνƒœμ™€ λ¬΄κ΄€ν•˜κ²Œ μ•ˆμ •μ μΈ μ„±λŠ₯을 λ‚Έλ‹€λŠ” μ μ—μ„œ κ°•λ ₯ν•œ 선택이닀.
  • μΆ”κ°€ λ©”λͺ¨λ¦¬κ°€ ν•„μš”ν•˜λ‹€λŠ” 점은 κ³ λ €ν•΄μ•Ό ν•œλ‹€.
λ°˜μ‘ν˜•