[μκ³ λ¦¬μ¦] μ λ ¬ - μ ν μ λ ¬, μ½μ μ λ ¬, ν΅ μ λ ¬, κ³μ μ λ ¬
μ λ ¬(Sorting)μ΄λ λ°μ΄ν°λ₯Ό νΉμ ν κΈ°μ€μ λ°λΌμ μμλλ‘ λμ΄νλ κ²μ λ§νλ€.
μ λ ¬ μκ³ λ¦¬μ¦μΌλ‘ λ°μ΄ν°λ₯Ό μ λ ¬νλ©΄ μ΄μ§ νμ(Binary Search)μ΄ κ°λ₯ν΄μ§λ€. λν νλ‘κ·Έλ¨μμ λ°μ΄ν°λ₯Ό κ°κ³΅ν λ μ΄λ€ μμΌλ‘λ μ λ ¬ν΄μ μ¬μ©νλ κ²½μ°κ° λ§κΈ° λλ¬Έμ μ λ ¬ μκ³ λ¦¬μ¦μ νλ‘κ·Έλ¨ μμ± μ κ°μ₯ λ§μ΄ μ¬μ©λλ μκ³ λ¦¬μ¦ μ€ νλμ΄λ€.
μ ν μ λ ¬(Selection Sort)
π‘ μμ΄λμ΄
λ°μ΄ν°κ° 무μμλ‘ μ¬λ¬ κ° μμ λ, κ·Έμ€μμ κ°μ₯ μμ λ°μ΄ν°λ₯Ό μ νν΄ λ§¨ μμ μλ λ°μ΄ν°μ λ°κΎΈκ³ , κ·Έλ€μ μμ λ°μ΄ν°λ₯Ό μ νν΄ μμμ λ λ²μ§Έ λ°μ΄ν°μ λ°κΎΈλ κ³Όμ μ λ°λ³΅ν΄λ³΄μ
=> λ§€λ² κ°μ₯ μμ κ²μ μ ννλ€
π‘ μμ€μ½λ
def sel_sort(array):
for i in range(len(array)):
min_index = i # κ°μ₯ μμ μμμ μΈλ±μ€
for j in range(i + 1, len(array)):
if array[j] < array[min_index]:
min_index = j
array[i], array[min_index] = array[min_index], array[i] # swap
return array
# μκ°λ³΅μ‘λ: O(N^2)
μ½μ μ λ ¬(Insertion Sort)
π‘ μμ΄λμ΄
λ°μ΄ν°λ₯Ό νλμ© νμΈνλ©°, κ° λ°μ΄ν°λ₯Ό μ μ ν μμΉμ μ½μ ν΄λ³΄μ
π‘ μμ€μ½λ
def ins_sort(array):
for i in range(1, len(array)):
for j in range(i, 0, -1):
if array[j] < array[j - 1]: # ν μΉΈμ© μΌμͺ½μΌλ‘ μ΄λ
array[j], array[j - 1] = array[j - 1], array[j]
else: # μκΈ°λ³΄λ€ μμ λ°μ΄ν°λ₯Ό λ§λλ©΄ κ·Έ μμΉμμ λ©μΆ€
break
return array
# μκ°λ³΅μ‘λ: O(N^2)
μ½μ μ λ ¬μ κ²½μ° μ λ ¬λ 리μ€νΈλ₯Ό μΈμλ‘ μ£Όμμ λ O(N)μ μλνλ€. μ΄μ΄μ λμ¬ ν΅ μ λ ¬κ³Ό λΉκ΅νμ λ, 보ν΅μ κ²½μ° μ½μ μ λ ¬μ΄ λ λΉν¨μ¨μ μ΄μ§λ§ μ λ ¬μ΄ κ±°μ λμ΄ μλ μν©μμλ λ κ°λ ₯νλ€λ κ²μ κΌ κΈ°μ΅νκ³ μ νμ©νμ!!!π
ν΅ μ λ ¬(Quick Sort)
π‘ μμ΄λμ΄
κΈ°μ€ λ°μ΄ν°λ₯Ό μ€μ νκ³ κ·Έ κΈ°μ€λ³΄λ€ ν° λ°μ΄ν°μ μμ λ°μ΄ν°μ μμΉλ₯Ό λ°κΏλ³΄μ!
π‘ λΆν κ³Όμ
ν΅ μ λ ¬μ κΈ°μ€(pivot)μ μ€μ ν λ€μ ν° μμ μμ μλ₯Ό κ΅νν ν, 리μ€νΈλ₯Ό λ°μΌλ‘ λλλ λ°©μμΌλ‘ λμνλ€.
νΌλ²μ μ€μ νλ λ°©λ²μλ μ¬λ¬ κ°μ§ λ°©μμ΄ μμ§λ§, μ¬κΈ°μλ λνμ μΈ λΆν λ°©μμΈ νΈμ΄ λΆν (Hoare Partition) λ°©μμΌλ‘ νΌλ²μ μ νκ² λ€. νΈμ΄ λΆν λ°©μμμλ '리μ€νΈμ 첫 λ²μ§Έ λ°μ΄ν°'λ₯Ό νΌλ²μΌλ‘ μ νλ€.
νΌλ²μ μ€μ ν λ€μλ μΌμͺ½μμλΆν° νΌλ²λ³΄λ€ ν° λ°μ΄ν°λ₯Ό μ°Ύκ³ , μ€λ₯Έμͺ½μμλΆν° νΌλ²λ³΄λ€ μμ λ°μ΄ν°λ₯Ό μ°Ύλλ€. κ·Έλ€μ ν° λ°μ΄ν°μ μμ λ°μ΄ν°μ μμΉλ₯Ό μλ‘ λ°κΎΌλ€. μ΄ κ³Όμ μ μΌμͺ½μμ μΆλ°ν ν¬μΈν°μ μ€λ₯Έμͺ½μμ μΆλ°ν ν¬μΈν°κ° μκ°λ¦΄ λκΉμ§ λ°λ³΅νλ€.
λ ν¬μΈν°κ° μκ°λ¦° μμ μμ, μμ λ°μ΄ν°μ νΌλ²μ μμΉλ₯Ό μλ‘ λ°κΎΌλ€. κ·Έλ κ² λλ©΄ νΌλ²μ μΌμͺ½μλ νΌλ²λ³΄λ€ μμ λ°μ΄ν°λ§, νΌλ²μ μ€λ₯Έμͺ½μλ νΌλ²λ³΄λ€ ν° λ°μ΄ν°λ§ μ‘΄μ¬νκ² λλ€. μ΄ κ³Όμ μ λΆν (Divide) λλ νν°μ (Partition)μ΄λΌκ³ νλ€.
νΌλ²μ λ°λΌ λΆν λ μνμμ μΌμͺ½ 리μ€νΈμ μ€λ₯Έμͺ½ 리μ€νΈλ₯Ό κ°λ³μ μΌλ‘ μ λ ¬μν€λ κ³Όμ μ λ°λ³΅νλ€ λ³΄λ©΄ μ 체 리μ€νΈμ λνμ¬ μ λ ¬μ΄ μ΄λ€μ§κ² λλ€.
π‘ μμ€μ½λ
def quickSort(array):
if len(array) <= 1:
return array
pivot = array[0]
tail = array[1:]
leftSide = [x for x in tail if x <= pivot]
rightSide = [x for x in tail if x > pivot]
return quickSort(leftSide) + [pivot] + quickSort(rightSide)
# νκ· μκ°λ³΅μ‘λ: O(NlogN)
# μ΅μ
μ κ²½μ°: O(N^2)
ν΅ μ λ ¬μμ μ΅μ μ κ²½μ°λ νΌλ²κ°μ΄ μ νν 리μ€νΈλ₯Ό μ λ°μ© λλλ κ²μ λ°λ³΅ν κ²½μ°μ΄λ€. μ΄ κ²½μ° μκ° λ³΅μ‘λλ O(NlogN)μ΄ λλ€.
ν΅ μ λ ¬μμ μ΅μ μ κ²½μ°λ μ΄λ―Έ μ λ ¬λ 리μ€νΈλ₯Ό μ λ ₯μΌλ‘ μ£Όμμ λμ΄λ€. μ΄ κ²½μ° μκ° λ³΅μ‘λλ O(N^2)μ΄ λλ€.
κ³μ μ λ ¬(Count Sort)
π‘ κ³μ μ λ ¬μ΄λ?
κ³μ μ λ ¬μ λ°μ΄ν°μ κ°μκ° N, λ°μ΄ν° μ€ μ΅λκ°μ΄ KμΌ λ μν μκ° O(N + K)λ₯Ό 보μ₯νλ μκ³ λ¦¬μ¦μ΄λ€.
νμ§λ§ μΈμ λ μ°κΈ° μ ν©ν κ²μ μλκ³ , λ°μ΄ν°μ ν¬κΈ° λ²μκ° μ νλμ΄ μ μ ννλ‘ ννν μ μμ λλ§ μ¬μ©ν μ μλ€. μΌλ°μ μΌλ‘ λ°μ΄ν°μ maxκ°κ³Ό minκ°μ μ°¨μ΄κ° 1,000,000μ λμ§ μμ λ ν¨κ³Όμ μΌλ‘ μ¬μ©ν μ μλ€. μλνλ©΄ κ³μ μ λ ¬μ μννλ €λ©΄ λͺ¨λ λ²μλ₯Ό λ΄μ μ μλ ν¬κΈ°μ 리μ€νΈκ° νμνκΈ° λλ¬Έμ΄λ€.
κ³μ μ λ ¬μ μν κ³Όμ μ λ€μκ³Ό κ°λ€.
- λ°μ΄ν°μ (min, max) λ²μλ₯Ό ν¬ν¨νλ νλμ 리μ€νΈλ₯Ό μμ±ν¨
- λ°μ΄ν°λ₯Ό νλμ© νμΈνλ©° λ°μ΄ν°μ κ°κ³Ό λμΌν μΈλ±μ€μ κ°μ 1μ© μ¦κ°μν΄
- 리μ€νΈμ 첫 λ²μ§Έ λ°μ΄ν°λΆν° κ·Έ κ°λ§νΌ μΈλ±μ€λ₯Ό μΆλ ₯
π‘ μμ€μ½λ
def countSort(array):
count = [0] * (max(array) + 1)
for x in array:
count[x] += 1
result = []
for i in range(len(count)):
for j in range(count[i]):
result.append(i)
return result
# μκ°λ³΅μ‘λ: O(N + K)
μ°Έκ³ μλ£: μ΄κ²μ΄ μ·¨μ μ μν μ½λ© ν μ€νΈλ€ with Python(λλλΉ μ , νλΉλ―Έλμ΄)