1 λΆ„ μ†Œμš”

Counting_Sort (κ³„μˆ˜ μ •λ ¬)

1. κ³„μˆ˜ μ •λ ¬μ΄λž€?

μ£Όμ–΄μ§„ λ°°μ—΄μ˜ κ°’ λ²”μœ„κ°€ μž‘μ€ 경우, O(n + k)의 μ‹œκ°„λ³΅μž‘λ„λ₯Ό κ°–λŠ” μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ (k: μ£Όμ–΄μ§„ λ°°μ—΄μ˜ κ°€μž₯ μž‘μ€ μš”μ†ŒλΆ€ν„° κ°€μž₯ 큰 μš”μ†ŒκΉŒμ§€μ˜ λ²”μœ„)

  • μž₯점: μž…λ ₯ λ°μ΄ν„°μ˜ 비ꡐ 없이 μ΄λ£¨μ–΄μ§€λŠ” μ •λ ¬μ΄λ―€λ‘œ, μ •λ ¬ 속도가 빠름
  • 단점: 크기가 ν•œμ •λ˜μ–΄ μžˆλŠ” 데이터에 λŒ€ν•΄μ„œλ§Œ μ •λ ¬ν•  수 있음
  • μ •λ ¬μ˜ λͺ©μ μ€ β€œνƒμƒ‰ κΈ°λŠ₯의 ν–₯상”이고, κ³„μˆ˜ 정렬은 O(n + k)의 맀우 λΉ λ₯Έ 속도λ₯Ό κ°€μ§„ μ •λ ¬μ΄λ―€λ‘œ, νŠΉμ • 쑰건에 λŒ€ν•΄μ„œλŠ” κ°€μž₯ λΉ λ₯Έ μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜μž„ (보톡 O(n)으둜 λ‚˜μ˜΄)

2. κ³„μˆ˜ μ •λ ¬μ˜ λ™μž‘ κ³Όμ •

  1. μž…λ ₯ 배열을 A, μ΅œμ’… 좜λ ₯ 배열을 B, 정렬을 μœ„ν•΄ λ§Œλ“œλŠ” 배열을 C라고 ν•˜μž.
  2. λ°°μ—΄-C의 ν¬κΈ°λŠ” λ°°μ—΄-A의 μš”μ†Œ 쀑 κ°€μž₯ 큰 κ°’μœΌλ‘œ μ§€μ •ν•œλ‹€. (ex) A=[1,5,3,3,2,1] -> C[5])
  3. λ°°μ—΄-A의 μš”μ†Œλ³„ 개수λ₯Ό λ°°μ—΄-C의 μΈλ±μŠ€κ°’κ³Ό μΌμΉ˜μ‹œμΌœ μ €μž₯ν•œλ‹€. (ex) A=[1,5,3,3,2,1] -> C=[0,2,1,2,0,1])
  4. λ°°μ—΄-Cμ—μ„œ, 0번째 λΆ€ν„° μ°¨λ‘€λŒ€λ‘œ 직전 μš”μ†Œμ˜ κ°’λ“€κ³Ό 더해가, μƒˆλ‘œμš΄ λ°°μ—΄-Cλ₯Ό λ§Œλ“ λ‹€. (ex) A=[1,5,3,3,2,1] -> C=[0,2,3,5,5,6]
  5. λ°°μ—΄-B의 ν¬κΈ°λŠ” C의 λ§ˆμ§€λ§‰ 인덱슀의 κ°’μœΌλ‘œ μ§€μ •ν•œλ‹€. (ex) C[5]=6 -> B[6])
  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]
  7. λ°°μ—΄-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)))

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°