λ°˜μ‘ν˜•

πŸ“₯ μ‚½μž… μ •λ ¬ (Insertion Sort) – 직관적이고 효율적인 μ •λ ¬ 방법

1. κ°œλ…

μ‚½μž… 정렬은 μΉ΄λ“œ μ •λ ¬κ³Ό λΉ„μŠ·ν•œ λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€.
두 번째 μ›μ†ŒλΆ€ν„° μ‹œμž‘ν•΄μ„œ, μ•žμͺ½ μ •λ ¬λœ ꡬ간에 μžμ‹ μ΄ λ“€μ–΄κ°ˆ 자리λ₯Ό μ°Ύμ•„ μ‚½μž…ν•˜λŠ” 방식이닀.


2. μ•Œκ³ λ¦¬μ¦˜ λ™μž‘ 방식

  1. 두 번째 μ›μ†ŒλΆ€ν„° μ‹œμž‘
  2. ν˜„μž¬ μ›μ†Œλ₯Ό μ•žμͺ½ μ •λ ¬λœ ꡬ간과 비ꡐ
  3. μžκΈ°λ³΄λ‹€ 큰 값듀을 λ’€λ‘œ ν•œ μΉΈμ”© 이동
  4. μ•Œλ§žμ€ μžλ¦¬μ— μ‚½μž…

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

void InsertionSort(int[] arr)
{
    for (int i = 1; i < arr.Length; i++)
    {
        int key = arr[i];
        int j = i - 1;

        // μ•žμͺ½ μ •λ ¬λœ κ΅¬κ°„μ—μ„œ 큰 값을 λ’€λ‘œ λ―Όλ‹€
        while (j >= 0 && arr[j] > key)
        {
            arr[j + 1] = arr[j];
            j--;
        }

        // μ˜¬λ°”λ₯Έ μœ„μΉ˜μ— μ‚½μž…
        arr[j + 1] = key;
    }
}

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

경우 μ‹œκ°„ λ³΅μž‘λ„
μ΅œμ•… (μ—­μˆœ μ •λ ¬λœ λ°°μ—΄) O(n²)
평균 O(n²)
μ΅œμ„  (이미 μ •λ ¬λœ λ°°μ—΄) O(n)
 
  • 곡간 λ³΅μž‘λ„: O(1)

5. νŠΉμ§•

  • 정렬이 거의 λ˜μ–΄ μžˆμ„μˆ˜λ‘ λΉ λ₯΄λ‹€
  • μ•ˆμ • μ •λ ¬ (같은 κ°’μ˜ μˆœμ„œκ°€ μœ μ§€λ¨)
  • μ½”λ“œ ꡬ쑰가 λ‹¨μˆœν•˜κ³  μ§κ΄€μ μ΄μ–΄μ„œ μ΄ˆλ³΄μžμ—κ²Œ μΆ”μ²œ
  • 데이터가 λ§Žμ„ κ²½μš°μ—λŠ” μ„±λŠ₯이 λ–¨μ–΄μ§„λ‹€

6. μ˜ˆμ‹œ

[4, 2, 5, 1]
→ 2 μ‚½μž… → [2, 4, 5, 1]
→ 5 μ‚½μž… → [2, 4, 5, 1]
→ 1 μ‚½μž… → [1, 2, 4, 5]
λ°˜μ‘ν˜•