π[Sort] Counting_Sort (κ³μ μ λ ¬)
Counting_Sort (κ³μ μ λ ¬)
1. κ³μ μ λ ¬μ΄λ?
μ£Όμ΄μ§ λ°°μ΄μ κ° λ²μκ° μμ κ²½μ°, O(n + k)μ μκ°λ³΅μ‘λλ₯Ό κ°λ μ λ ¬ μκ³ λ¦¬μ¦ (k: μ£Όμ΄μ§ λ°°μ΄μ κ°μ₯ μμ μμλΆν° κ°μ₯ ν° μμκΉμ§μ λ²μ)
- μ₯μ : μ λ ₯ λ°μ΄ν°μ λΉκ΅ μμ΄ μ΄λ£¨μ΄μ§λ μ λ ¬μ΄λ―λ‘, μ λ ¬ μλκ° λΉ λ¦
- λ¨μ : ν¬κΈ°κ° νμ λμ΄ μλ λ°μ΄ν°μ λν΄μλ§ μ λ ¬ν μ μμ
- μ λ ¬μ λͺ©μ μ βνμ κΈ°λ₯μ ν₯μβμ΄κ³ , κ³μ μ λ ¬μ O(n + k)μ λ§€μ° λΉ λ₯Έ μλλ₯Ό κ°μ§ μ λ ¬μ΄λ―λ‘, νΉμ 쑰건μ λν΄μλ κ°μ₯ λΉ λ₯Έ μκ³ λ¦¬μ¦ μ€ νλμ (λ³΄ν΅ O(n)μΌλ‘ λμ΄)
2. κ³μ μ λ ¬μ λμ κ³Όμ
- μ λ ₯ λ°°μ΄μ A, μ΅μ’ μΆλ ₯ λ°°μ΄μ B, μ λ ¬μ μν΄ λ§λλ λ°°μ΄μ CλΌκ³ νμ.
- λ°°μ΄-Cμ ν¬κΈ°λ λ°°μ΄-Aμ μμ μ€ κ°μ₯ ν° κ°μΌλ‘ μ§μ νλ€. (ex) A=[1,5,3,3,2,1] -> C[5])
- λ°°μ΄-Aμ μμλ³ κ°μλ₯Ό λ°°μ΄-Cμ μΈλ±μ€κ°κ³Ό μΌμΉμμΌ μ μ₯νλ€. (ex) A=[1,5,3,3,2,1] -> C=[0,2,1,2,0,1])
- λ°°μ΄-Cμμ, 0λ²μ§Έ λΆν° μ°¨λ‘λλ‘ μ§μ μμμ κ°λ€κ³Ό λν΄κ°, μλ‘μ΄ λ°°μ΄-Cλ₯Ό λ§λ λ€. (ex) A=[1,5,3,3,2,1] -> C=[0,2,3,5,5,6]
- λ°°μ΄-Bμ ν¬κΈ°λ Cμ λ§μ§λ§ μΈλ±μ€μ κ°μΌλ‘ μ§μ νλ€. (ex) C[5]=6 -> B[6])
- λ°°μ΄-Aμ λ§μ§λ§ λ ΈλλΆν° μ°¨λ‘λλ‘ λ°°μ΄-Cμ λΉκ΅νμ¬ Bμ λμ νλ€. (ex) A[6]=1 -> C=[0,2,3,5,5,6]μμ 1μ΄ νλ λΉ μ Έλκ°λ―λ‘ C[1]βμ΄ λμ΄, C=[0,1,3,5,5,6] -> B=[null,null,1,null,null,null,null]
- λ°°μ΄-Aμ 첫 λ²μ§Έ λ ΈλκΉμ§ μλ£ν λκΉμ§ μ κ³Όμ μ λ°λ³΅νλ€.
3. μμ μ½λ
μΆμ²: ratsgoβs blog [https://ratsgo.github.io/data%20structure&algorithm/2017/10/16/countingsort/]
# counting_sort (κ³μ μ λ ¬)
# A: μ
λ ₯ λ°μ΄ν°
# k : Aμ μμ μ€ μ΅λκ°
def counting_sort(A, k):
# B: μΆλ ₯ λ°μ΄ν°
# -1λ‘ μ΄κΈ°ν
B = [-1]*len(A)
# C: counting λ°μ΄ν°
# 0μΌλ‘ μ΄κΈ°ν
C = [0] * (k + 1)
# λμκ³Όμ
for i in A:
C[i] += 1
# C μ λ ¬
for i in range(k):
C[i+1] += C[i]
# B μ λ ¬
for i in reversed(range(len(A))):
B[C[A[i]] - 1] = A[i]
C[A[i]] -= 1
return B
input_data = [ 1,3,2,4,3,
2,5,3,1,2,
3,4,4,3,5,
1,2,3,5,2,
3,1,4,3,5,
1,2,1,1,1 ]
max_in_input = max(input_data)
print(counting_sort(input_data, max(input_data)))
λκΈλ¨κΈ°κΈ°