νμ΄μ¬ μ νμ λ ¬ μκ³ λ¦¬μ¦μ νλ‘κ·Έλλ° μ λ¬Έμλ€μ΄ μ΄ν΄νκΈ° μ½κ³ , κΈ°λ³Έμ μΈ μ λ ¬ μκ³ λ¦¬μ¦ μ€ νλλ‘ μμ£Ό μ¬μ©λ©λλ€. μ΄λ² ν¬μ€νΈμμλ μ νμ λ ¬ μκ³ λ¦¬μ¦μ μ μ, λμ μ리, νμ΄μ¬ μ½λ ꡬν, μ₯λ¨μ λ±μ μμΈν μ€λͺ νκ² μ΅λλ€.
β£ λͺ©μ°¨
μκ³ λ¦¬μ¦ μ±λ₯ λΆμμ λν λ΄μ©μ μλ ν¬μ€ν
μ μ°Έκ³ ν΄ μ£ΌμΈμπ
01. μ ν μ λ ¬ μκ³ λ¦¬μ¦μ΄λ?π€
μ ν μ λ ¬(Selection Sort)μ μ λ ¬λμ§ μμ λ°μ΄ν°λ€ μ€μμ κ°μ₯ μμ κ°μ μ°Ύμ 첫 λ²μ§Έ κ°κ³Ό κ΅ννκ³ , κ·Έλ€μ μμ κ°μ μ°Ύμ λ λ²μ§Έ κ°κ³Ό κ΅ννλ κ³Όμ μ λ°λ³΅νλ μ λ ¬ μκ³ λ¦¬μ¦μ λλ€. μ΄λ λ§€λ² κ°μ₯ μμ κ°μ μ ννμ¬ λ°°μ΄μ μλΆλΆμΌλ‘ μ΄λμν€λ λ°©μμΌλ‘ λμν©λλ€. μ ν μ λ ¬μ μκ° λ³΅μ‘λλ O(n²)λ‘, ν° λ°μ΄ν°μ μλ λΉν¨μ¨μ μΌ μ μμ΅λλ€.
μ ν μ λ ¬ μκ³ λ¦¬μ¦μ λ¨κ³λ λ€μκ³Ό κ°μ΅λλ€:
- μ£Όμ΄μ§ 리μ€νΈμμ μ λ ¬λμ§ μμ λΆλΆ μ€ κ°μ₯ μμ μμλ₯Ό μ°Ύμ΅λλ€.
- μ°Ύμ κ°μ₯ μμ μμλ₯Ό 리μ€νΈμ 맨 μ μμμ κ΅νν©λλ€.
- μ λ ¬λ λΆλΆμ μ μΈν λλ¨Έμ§ λ¦¬μ€νΈμ λν΄ μμ κ³Όμ μ λ°λ³΅ν©λλ€.
μ΄ κ³Όμ μ 리μ€νΈ μ μ²΄κ° μ λ ¬λ λκΉμ§ λ°λ³΅ν©λλ€.
02. νμ΄μ¬μΌλ‘ μ ν μ λ ¬ ꡬννκΈ°π»
μ ν μ λ ¬ μκ³ λ¦¬μ¦μ λμμ λ¨κ³λ³λ‘ μ€λͺ νκ³ , μ΄λ₯Ό νμ΄μ¬ μ½λλ‘ κ΅¬νν΄ λ³΄κ² μ΅λλ€.
λ¨κ³λ³ μ€λͺ :
- λ°°μ΄μ 첫 λ²μ§Έ μμΉλΆν° μμν©λλ€.
- νμ¬ μμΉλΆν° λ°°μ΄μ λκΉμ§μ μμ μ€ κ°μ₯ μμ κ°μ μ°Ύμ΅λλ€.
- κ°μ₯ μμ κ°μ νμ¬ μμΉμ κ°κ³Ό κ΅νν©λλ€.
- λ°°μ΄μ λͺ¨λ μμμ λν΄ μ κ³Όμ μ λ°λ³΅ν©λλ€.
νμ΄μ¬ μ½λ μμ :
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
# μ¬μ© μμ
array = [64, 25, 12, 22, 11]
sorted_array = selection_sort(array)
print("μ λ ¬λ λ°°μ΄:", sorted_array)
03. μ ν μ λ ¬μ μ₯λ¨μ ππ
μ₯μ :
- κ°λ¨νκ³ μ§κ΄μ :
μ ν μ λ ¬μ μ΄ν΄νκ³ κ΅¬ννκΈ° μ½μ΅λλ€. μκ³ λ¦¬μ¦μ΄ μ΄λ»κ² μλνλμ§ μ§κ΄μ μΌλ‘ μ΄ν΄ν μ μμ΅λλ€. - μ μ리 μ λ ¬ (In-place Sorting):
μΆκ°μ μΈ λ©λͺ¨λ¦¬ 곡κ°μ κ±°μ μ¬μ©νμ§ μμ΅λλ€. 리μ€νΈ λ΄λΆμμ μ§μ κ΅ν μμ μ΄ μ΄λ£¨μ΄μ§λ―λ‘, κ³΅κ° λ³΅μ‘λκ° O(1)μ λλ€. - μΌκ΄λ μ±λ₯:
λ°μ΄ν°μ μ΄κΈ° μνμ 무κ΄νκ² νμ μΌμ ν μκ° λ³΅μ‘λλ₯Ό κ°μ§λλ€. λ°μ΄ν°κ° μ΄λ―Έ μ λ ¬λμ΄ μκ±°λ 무μμλ‘ μμ¬ μλλΌλ μ±λ₯μ ν° μ°¨μ΄κ° μμ΅λλ€. - μ μ κ΅ν νμ:
λ€λ₯Έ O(n²) μκ³ λ¦¬μ¦μΈ λ²λΈ μ λ ¬μ λΉν΄ κ΅ν νμκ° μ μ΅λλ€. 리μ€νΈμ μμ μκ° μ κ±°λ κ΅ν λΉμ©μ΄ ν΄ λ μ 리ν μ μμ΅λλ€.
λ¨μ :
- λλ¦° μκ° λ³΅μ‘λ:
μ ν μ λ ¬μ μκ° λ³΅μ‘λλ μ΅μ , μ΅μ , νκ· λͺ¨λ O(n²) μ λλ€. 리μ€νΈκ° 컀μ§μλ‘ μ±λ₯μ΄ κΈκ²©ν μ νλ©λλ€. λ°λΌμ λκ·λͺ¨ λ°μ΄ν° μ§ν©μ μ λ ¬νλ λ° μ ν©νμ§ μμ΅λλ€. - λΉκ΅ νμ λ§μ:
νμ nλ²μ λΉκ΅λ₯Ό μνν©λλ€. μ΄λ 리μ€νΈκ° 컀μ§μλ‘ λ§€μ° λΉν¨μ¨μ μ λλ€. - λΆμμ μ λ ¬:
λμΌν κ°μ΄ μλ μμλ€ κ°μ μμκ° λ³΄μ₯λμ§ μμ΅λλ€. μμ μ±μ΄ μ€μν κ²½μ° μ ν μ λ ¬μ μ ν©νμ§ μμ΅λλ€. - μ μμ± λΆμ‘±:
μ ν μ λ ¬μ λ°μ΄ν°κ° μ΄λ―Έ μ λ ¬λμ΄ μλ κ²½μ°μλ μ¬μ ν O(n²)μ μκ°μ΄ 걸립λλ€. μ΄λ λ€λ₯Έ μ μν μ λ ¬ μκ³ λ¦¬μ¦(μ: μ½μ μ λ ¬)μ΄ μ΄λ―Έ μ λ ¬λ 리μ€νΈμ λν΄ λ λΉ λ₯΄κ² μλνλ κ²κ³Ό λμ‘°μ μ λλ€.
μμ½:
μ ν μ λ ¬μ κ°λ¨νκ³ μ§κ΄μ μΈ μκ³ λ¦¬μ¦μΌλ‘, μκ·λͺ¨ λ°μ΄ν° μ§ν©μ΄λ μΆκ° λ©λͺ¨λ¦¬κ° μ νλ νκ²½μμ μ μ©ν μ μμ΅λλ€. κ·Έλ¬λ λκ·λͺ¨ λ°μ΄ν° μ§ν©μ λ€λ£¨κ±°λ μ±λ₯μ΄ μ€μν κ²½μ°, ν΅ μ λ ¬, λ³ν© μ λ ¬, ν μ λ ¬ λ± λ ν¨μ¨μ μΈ μ λ ¬ μκ³ λ¦¬μ¦μ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
04. μ ν μ λ ¬ μκ³ λ¦¬μ¦μ μκ°μ μ΄ν΄πΌοΈ
μ ν μ λ ¬ μκ³ λ¦¬μ¦μ μκ°μ μ΄ν΄λ₯Ό λκΈ° μν΄, κ°λ¨ν μμ μ ν¨κ» κ° λ¨κ³λ³λ‘ μ΄λ»κ² μ λ ¬μ΄ μ΄λ£¨μ΄μ§λμ§ μ€λͺ νκ² μ΅λλ€. μλ₯Ό λ€μ΄, λ€μκ³Ό κ°μ 리μ€νΈλ₯Ό μ ν μ λ ¬λ‘ μ λ ¬ν΄ λ³΄κ² μ΅λλ€: 리μ€νΈ = [64,25,12,22,11]
λ¨κ³λ³ μ€λͺ :
μ΄κΈ° 리μ€νΈ: [64,25,12,22,11]
첫 λ²μ§Έ λ¨κ³ (i = 0):
- 리μ€νΈμμ κ°μ₯ μμ μμλ₯Ό μ°Ύμ΅λλ€. (11)
- 11μ 첫 λ²μ§Έ μμ(64)μ κ΅νν©λλ€. [11,25,12,22,64]
λ λ²μ§Έ λ¨κ³ (i = 1):
- λλ¨Έμ§ λ¦¬μ€νΈμμ κ°μ₯ μμ μμλ₯Ό μ°Ύμ΅λλ€. (12)
- 12λ₯Ό λ λ²μ§Έ μμ(25)μ κ΅νν©λλ€. [11,12,25,22,64]
μΈ λ²μ§Έ λ¨κ³ (i = 2):
- λλ¨Έμ§ λ¦¬μ€νΈμμ κ°μ₯ μμ μμλ₯Ό μ°Ύμ΅λλ€. (22)
- 22λ₯Ό μΈ λ²μ§Έ μμ(25)μ κ΅νν©λλ€. [11,12,22,25,64]
λ€ λ²μ§Έ λ¨κ³ (i = 3):
- λλ¨Έμ§ λ¦¬μ€νΈμμ κ°μ₯ μμ μμλ₯Ό μ°Ύμ΅λλ€. (25)
- 25λ μ΄λ―Έ λ€ λ²μ§Έ μμΉμ μμΌλ―λ‘ κ΅ννμ§ μμ΅λλ€. [11,12,22,25,64]
λ§μ§λ§ λ¨κ³ (i = 4):
- 리μ€νΈμ λ§μ§λ§ μμλ μ΄λ―Έ μ λ ¬λμ΄ μμΌλ―λ‘ κ΅ννμ§ μμ΅λλ€. [11,12,22,25,64]
μκ°μ μ€λͺ :
κ° λ¨κ³μμ 리μ€νΈμ νμ¬ μνλ₯Ό μκ°μ μΌλ‘ νννλ©΄ λ€μκ³Ό κ°μ΅λλ€:
- μ΄κΈ° 리μ€νΈ:
[64, 25, 12, 22, 11]
- 첫 λ²μ§Έ λ¨κ³:
[11, 25, 12, 22, 64] (11κ³Ό 64 κ΅ν)
- λ λ²μ§Έ λ¨κ³:
[11, 12, 25, 22, 64] (12μ 25 κ΅ν)
- μΈ λ²μ§Έ λ¨κ³:
[11, 12, 22, 25, 64] (22μ 25 κ΅ν)
- λ€ λ²μ§Έ λ¨κ³:
[11, 12, 22, 25, 64] (μ΄λ―Έ μ λ ¬λ¨)
- λ€μ― λ²μ§Έ λ¨κ³:
[11, 12, 22, 25, 64] (μ΄λ―Έ μ λ ¬λ¨)
05. μ ν μ λ ¬μ κ°μ ν μ μλ λ°©λ²π‘
μ ν μ λ ¬μ κ·Έ μ체λ‘λ κ°λ¨νκ³ μ§κ΄μ μΈ μκ³ λ¦¬μ¦μ΄μ§λ§, ν¨μ¨μ± λ©΄μμλ μ΅μ νκ° μ΄λ ΅μ΅λλ€. μ ν μ λ ¬μ μκ° λ³΅μ‘λλ νμ O(n²) μ΄λ©°, μ΄λ λκ·λͺ¨ λ°μ΄ν° μ§ν©μ μ λ ¬ν λ λ§€μ° λΉν¨μ¨μ μ λλ€. κ·Έλ¬λ μ ν μ λ ¬μ μΌλΆ λ¨μ μ 보μνκ±°λ νΉμ μν©μμ λ ν¨μ¨μ μΌλ‘ μλνκ² λ§λ€κΈ° μν΄ λ€μκ³Ό κ°μ λ°©λ²μ κ³ λ €ν μ μμ΅λλ€:
1. μλ°©ν₯ μ ν μ λ ¬ (Double Selection Sort)
μλ°©ν₯ μ ν μ λ ¬μ ν λ²μ λ°λ³΅μ ν΅ν΄ κ°μ₯ μμ μμμ κ°μ₯ ν° μμλ₯Ό λμμ μ°Ύκ³ , μ΄λ₯Ό κ°κ° 리μ€νΈμ μμκ³Ό λ λΆλΆμ λ°°μΉνλ λ°©μμ λλ€. μ΄λ₯Ό ν΅ν΄ λ°λ³΅ νμλ₯Ό μ€μΌ μ μμ΅λλ€.
def double_selection_sort(arr):
n = len(arr)
for i in range(n // 2):
min_index = i
max_index = i
# 리μ€νΈμ μ λ ¬λμ§ μμ λΆλΆμμ κ°μ₯ μμ μμμ κ°μ₯ ν° μμλ₯Ό μ°Ύμ
for j in range(i, n - i):
if arr[j] < arr[min_index]:
min_index = j
if arr[j] > arr[max_index]:
max_index = j
# μ°Ύμ κ°μ₯ μμ μμλ₯Ό μ λ ¬λμ§ μμ λΆλΆμ 첫 λ²μ§Έ μμμ κ΅ν
arr[i], arr[min_index] = arr[min_index], arr[i]
# μ°Ύμ κ°μ₯ ν° μμλ₯Ό μ λ ¬λμ§ μμ λΆλΆμ λ§μ§λ§ μμμ κ΅ν
# λ§μ½ κ°μ₯ ν° μμκ° μ²« λ²μ§Έ μμμ κ΅νλμλ€λ©΄, max_indexλ₯Ό μ
λ°μ΄νΈ
if max_index == i:
max_index = min_index
arr[n - 1 - i], arr[max_index] = arr[max_index], arr[n - 1 - i]
return arr
2. κ°μ λ λΉκ΅/κ΅ν λ‘μ§
μ ν μ λ ¬μ μμ μ μΈ μ λ ¬ μκ³ λ¦¬μ¦μ΄ μλλ©°, κ΅νμ΄ λ§μ κ²½μ° μ±λ₯μ΄ μ νλ μ μμ΅λλ€. μ΄λ₯Ό 보μνκΈ° μν΄ λΆνμν κ΅νμ νΌνκ±°λ κ΅ν νμλ₯Ό μ€μ΄λ λ°©λ²μ κ³ λ €ν μ μμ΅λλ€. λ€λ§, μ΄ λ°©λ²λ€μ μ ν μ λ ¬μ κ·Όλ³Έμ μΈ μκ° λ³΅μ‘λλ₯Ό ν¬κ² κ°μ νμ§λ μμ΅λλ€.
3. νμ΄λΈλ¦¬λ μ κ·Όλ²
μΌλΆ κ²½μ°μλ μ ν μ λ ¬μ λ€λ₯Έ ν¨μ¨μ μΈ μκ³ λ¦¬μ¦κ³Ό κ²°ν©νλ κ²λ μ’μ λ°©λ²μ λλ€. μλ₯Ό λ€μ΄, μμ ν¬κΈ°μ 리μ€νΈλ κ±°μ μ λ ¬λ 리μ€νΈμ λν΄μλ μ ν μ λ ¬μ μ¬μ©νκ³ , ν° ν¬κΈ°μ 리μ€νΈλ 무μμλ‘ μμΈ λ¦¬μ€νΈμ λν΄μλ ν΅ μ λ ¬μ΄λ λ³ν© μ λ ¬κ³Ό κ°μ ν¨μ¨μ μΈ μκ³ λ¦¬μ¦μ μ¬μ©νλ κ²μ λλ€.
4. μ΄κΈ° λ¨κ³ μ΅μ ν
μ ν μ λ ¬μ μ΄κΈ° λ¨κ³μμ 리μ€νΈκ° μ΄λ―Έ κ±°μ μ λ ¬λμ΄ μλ κ²½μ°, μ΄λ¬ν κ²½μ°λ₯Ό κ°μ§νμ¬ μ λ ¬μ μ‘°κΈ°μ μ’ λ£νλ μ΅μ νλ₯Ό κ³ λ €ν μ μμ΅λλ€.
μ ν μ λ ¬μ νκ³
μ ν μ λ ¬μ λ³Έμ§μ μΌλ‘ λΉκ΅ νμκ° λ§κΈ° λλ¬Έμ ν° λ¦¬μ€νΈλ₯Ό μ λ ¬νλ λ°λ λΉν¨μ¨μ μ λλ€. λ°λΌμ, μ ν μ λ ¬μ κ·Όλ³Έμ μΌλ‘ κ°μ νλ κ²λ³΄λ€λ λ ν¨μ¨μ μΈ μ λ ¬ μκ³ λ¦¬μ¦μ μ¬μ©νλ κ²μ΄ λλΆλΆμ κ²½μ° λ λμ μ νμ λλ€. μλ₯Ό λ€μ΄, ν΅ μ λ ¬, λ³ν© μ λ ¬, ν μ λ ¬κ³Ό κ°μ μκ³ λ¦¬μ¦μ νκ· μ μΌλ‘ O(n log β‘n)μ μκ° λ³΅μ‘λλ₯Ό κ°μ§λ©°, λκ·λͺ¨ λ°μ΄ν° μ§ν©μ λ μ ν©ν©λλ€.
μμ½νμλ©΄, μ ν μ λ ¬μ μ½κ°μ μ΅μ νλ‘ κ°μ ν μλ μμ§λ§, κ·Όλ³Έμ μΈ νκ³ λλ¬Έμ ν° λ°μ΄ν° μ§ν©μ λν΄μλ λ ν¨μ¨μ μΈ μκ³ λ¦¬μ¦μ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.