๐[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)))
๋๊ธ๋จ๊ธฐ๊ธฐ