λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜

μ •λ ¬(Sorting)-선택정렬, 버블정렬, μ‚½μž…μ •λ ¬, 병합정렬

by alswlfl 2026. 4. 4.

1. 선택 μ •λ ¬(Selection Sort)

λ§€ λ‹¨κ³„μ—μ„œ '아직 μ²˜λ¦¬λ˜μ§€ μ•Šμ€ κ°€μž₯ μž‘μ€ μ›μ†Œλ₯Ό 선택'ν•΄μ„œ μ•žμœΌλ‘œ λ³΄λ‚΄λŠ” μ •λ ¬ 방법

  • μ•žμœΌλ‘œ 보내진 μ›μ†ŒλŠ” 더 이상 μœ„μΉ˜κ°€ λ³€κ²½λ˜μ§€ μ•ŠμŒ
  • μ„ ν˜• 탐색: λ§€ λ‹¨κ³„μ—μ„œ κ°€μž₯ μž‘μ€ 것 μ„ νƒν•˜λŠ”λ° μ•½ N번의 μ—°μ‚° ν•„μš”
  • μ‹œκ°„ λ³΅μž‘λ„: O(N2) → λΉ„νš¨μœ¨μ 

[λ™μž‘λ°©μ‹]

1. 각 λ‹¨κ³„μ—μ„œ κ°€μž₯ μž‘μ€ μ›μ†Œλ₯Ό 선택

2. ν˜„μž¬κΉŒμ§€ μ²˜λ¦¬λ˜μ§€ μ•Šμ€ μ›μ†Œλ“€ 쀑 κ°€μž₯ μ•žμ˜ μ›μ†Œμ™€ μœ„μΉ˜ ꡐ체

선택정렬 μ˜ˆμ‹œ

 

 

2. 버블 μ •λ ¬(Bubble Sort)

버블: μ„œλ‘œ μΈμ ‘ν•œ 두 μ›μ†Œλ₯Ό λΉ„κ΅ν•˜λŠ” ν˜•νƒœκ°€ κ±°ν’ˆκ³Ό κ°™λ‹€κ³ ν•΄μ„œ λΆ™μ—¬μ§„ 이름이닀.

 

μΈμ ‘ν•œ 두 μ›μ†Œλ₯Ό ν™•μΈν•΄μ„œ 정렬이 μ•ˆλ˜μ–΄ μžˆλ‹€λ©΄ μœ„μΉ˜λ₯Ό μ„œλ‘œ λ³€κ²½

→ 각 단계λ₯Ό κ±°μΉ  λ•Œλ§ˆλ‹€ κ°€μž₯ 큰 값을 ν•˜λ‚˜μ”© ν™•μ‹€ν•˜κ²Œ 결정함!(즉, 였λ₯Έμͺ½λΆ€ν„° μ°¨λ‘€λŒ€λ‘œ 정렬됨)

[λ™μž‘ 방식]

1. 첫 번째 인덱슀 μ›μ†Œμ™€ 두 번째 인덱슀 μ›μ†Œ 비ꡐ

2. 두 번째 인덱슀 μ›μ†Œμ™€ μ„Έ 번째 인덱슀 μ›μ†Œ 비ꡐ

...

→ ν•œ 번의 단계가 μˆ˜ν–‰λ˜λ©΄, κ°€μž₯ 큰 μ›μ†Œκ°€ 맨 λ’€λ‘œ μ΄λ™ν•œλ‹€.(κ·Έ λ‹€μŒ λ‹¨κ³„μ—μ„œλŠ” 맨 λ’€λ‘œ μ΄λ™ν•œ λ°μ΄ν„°λŠ” μ •λ ¬μ—μ„œ μ œμ™Έν•¨)

버블정렬 μ˜ˆμ‹œ

 

 

3. μ‚½μž… μ •λ ¬(Insertion Sort)

각 숫자λ₯Ό μ μ ˆν•œ μœ„μΉ˜μ— μ‚½μž…ν•˜λŠ” μ •λ ¬ 기법

  • μ‹œκ°„λ³΅μž‘λ„
    • μ΅œμ„ μ˜ 경우: O(N)
    • μ΅œμ•…μ˜ 경우: O(N2) → λΉ„νš¨μœ¨μ 
  • 이미 μ •λ ¬λ˜μ–΄ μžˆλŠ” κ²½μš°λŠ” λΉ λ₯΄κ²Œ μˆ˜ν–‰ κ°€λŠ₯(선택, 버블과 달리 속도가 빠름)

[λ™μž‘ 방식]

1. 각 λ‹¨κ³„μ—μ„œ ν˜„μž¬ μ›μ†Œκ°€ μ‚½μž…λ  μœ„μΉ˜λ₯Ό 찾음

2. μ μ ˆν•œ μœ„μΉ˜μ— 도달할 λ•ŒκΉŒμ§€ 반볡적으둜 μ™Όμͺ½μœΌλ‘œ 이동

οΉ‘μ‚½μž… μ •λ ¬ μ²˜μŒμ— 첫 번째 μ›μ†Œλ₯Ό 정렬이 λ˜μ–΄μžˆλ‹€κ³  κ°€μ •

μ‚½μž… μ •λ ¬ μ˜ˆμ‹œ

 

 

4. 병합(=합병) μ •λ ¬

μ „ν˜•μ μΈ 뢄할정볡(divide and conquer) μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜

  • λΉ λ₯Έ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜
    • λΆ„ν• (divide): 큰 문제λ₯Ό μž‘μ€ λΆ€λΆ„ 문제(μ‰¬μš΄ 문제)둜 λΆ„ν• 
    • 정볡(conquer): μž‘μ€ λΆ€λΆ„ 문제λ₯Ό 각각 ν•΄κ²°
    • μ‘°ν•©(combine): ν•΄κ²°ν•œ λΆ€λΆ„ 문제의 닡을 μ΄μš©ν•΄μ„œ λ‹€μ‹œ 큰 문제λ₯Ό ν•΄κ²°
  • 큰 문제 μͺΌκ°œκΈ° → μž‘μ€ 문제 각각 ν•΄κ²° → λ‹€μ‹œ 합쳐 큰 문제 ν•΄κ²°
  • μž¬κ·€ν•¨μˆ˜ μ΄μš©ν•΄μ„œ κ΅¬ν˜„(더 이상 μͺΌκ°€ 수 μ—†λŠ” 크기가 될 λ•ŒκΉŒμ§€ κ³„μ†ν•΄μ„œ λΆ„ν• )
    → 이럴 경우 μ˜€λ²„ ν—€λ“œ(overhead)둜 이어져 λ©”λͺ¨λ¦¬ μ†Œλͺ¨κ°€ 큼
  • μ‹œκ°„ λ³΅μž‘λ„: O(NlogN)
  • μ§κ΄€μ μœΌλ‘œ μƒκ°ν–ˆμ„ λ•Œ, 높이가 O(logN)이고, λ„ˆλΉ„κ°€ O(N)인 μ •μ‚¬κ°ν˜•κ³Ό μœ μ‚¬
  • μž₯점: μ΅œμ•…μ˜ κ²½μš°μ—λ„ O(NlogN)을 보μž₯ν•  수 있음
  • 단점: 일반적인 경우, 정볡 κ³Όμ •μ—μ„œ μž„μ‹œ λ°°μ—΄ ν•„μš”

[λ™μž‘ 방식]

병합정렬 μ˜ˆμ‹œ

1. λΆ„ν• : μ •λ ¬ν•  λ°°μ—΄(큰 문제)을 같은 크기의 λΆ€λΆ„ λ°°μ—΄(μž‘μ€ 문제)2개둜 λΆ„ν•  → λ‹¨μˆœνžˆ λ°°μ—΄μ˜ 크기λ₯Ό 절반으둜 μͺΌκ°œλŠ” 것

2. 정볡: λΆ€λΆ„ 배열을 μ •λ ¬ → μž‘μ€ 문제 ν•΄κ²°(두 개의 λΆ€λΆ„ 배열을 'μ •λ ¬λœ ν•˜λ‚˜μ˜ λ°°μ—΄'둜 λ§Œλ“ λ‹€)

정볡 아이디어
- 각 λΆ€λΆ„ 배열은 이미 μ •λ ¬λœ μƒνƒœλ‘œ λ΄„
- 각 λΆ€λΆ„ 배열에 λŒ€ν•΄ 첫번째 μ›μ†ŒλΆ€ν„° μ‹œμž‘ν•΄μ„œ ν•˜λ‚˜μ”© 확인
- 총 μ›μ†Œμ˜ κ°œμˆ˜κ°€ N개일 λ•Œ, O(N)의 μ‹œκ°„ λ³΅μž‘λ„κ°€ μš”κ΅¬λ¨

 

3. μ‘°ν•©: μ •λ ¬λœ λΆ€λΆ„ 배열을 ν•˜λ‚˜μ˜ λ°°μ—΄λ‘œ λ‹€μ‹œ 병합