Counting Sort(๊ณ์์ ๋ ฌ)์ ์ซ์๋ค๊ฐ ๋น๊ต๋ฅผ ํ์ง ์๊ณ ์ ๋ ฌ์ ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ผ์ผ์ด ๋น๊ต๋ฅผ ํ์ง ์๊ณ ๊ฐ ์ซ์๊ฐ ๋ช๊ฐ์ธ์ง ์ผ ๋ค์์ ์ ๋ ฌ์ ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๋ O(n)
์ด ๋์ค๊ฒ ๋๋ค. ๋ค๋ง, Counting sort๋ ๋ชจ๋ ๋ฆฌ์คํธ์ ์ ์ฉ์ ํ ์๋ ์๊ณ , ์ผ์ ํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฆฌ์คํธ๋ค์๋ง ํด๋น ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ ์ ์๋ค. ์กฐ๊ฑด๋ค์ ๋ค์๊ณผ ๊ฐ๋ค:
- ๋ฆฌ์คํธ ๋ด์ ๋ชจ๋ element๋ค์ ์ ์์ฌ์ผ ํ๋ค
- ๋ฆฌ์คํธ ๋ด์ ๋ชจ๋ element๋ค์ ๋ฒ์๋ 0~k (k๋ ์ ์)์ฌ์ผ ํ๋ค
- k=O(n)์ผ๋ก ๋ํ๋์ง ์ ์์ด์ผ ํ๋ค
์ด์ pseudo ์ฝ๋๋ฅผ ๋ผ์ธ๋ณ๋ก ๋ถ์ํด๋ณด๋ ค๊ณ ํ๋ค.
A๋ผ๋ ์ ๋ ฌ๋์ง ์์ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๊ณ ์ ํ๋ค.
- ๋ผ์ธ 1~2 : C๋ผ๋ ๋ฆฌ์คํธ๋ฅผ ์๋ก ๋ง๋๋๋ฐ, ์ด C์ ๊ธธ์ด๋ k์ด๋ค. Counting sort์ ๋ฒ์๋ 0~k๊ฐ ๋์ด์ผ ํ๋ค๊ณ ํ๊ณ , ํ์ฌ ์ฃผ์ด์ง ๋ฆฌ์คํธ์์ k๋ 5์ด๋ค. ๊ทธ๋์ 0~5, ์ด ๊ธธ์ด 6์ธ C๋ฆฌ์คํธ๊ฐ ๋ง๋ค์ด์ง๋ ๊ฒ์ด๋ค.
-
๋ผ์ธ 3~4: ์ด์ C๋ผ๋ ๋ฆฌ์คํธ์ ๊ฐ๊ฐ element๋ค์ด ๋ช๊ฐ์ธ์ง ์ถ๊ฐ๋ฅผ ํ๋ค. ์ด๊ธฐ์ C๋ 0์ผ๋ก ์ด๊ธฐํ ๋์๊ณ , A๋ฅผ 0๋ฒ์งธ index๋ถํฐ ๊ธธ์ด๊น์ง ์ํ๋ฅผ ํ๋ฉด์ ํด๋น๋๋ ๊ฐ์ C์ 1์ฉ ๋ํด๋๊ฐ๋ค.
C[A[j]] = C[A[j]] + 1
์ด ๋ถ๋ถ์ ์์๋ก ์ค๋ช ํด๋ณด์๋ฉด,- ์ฒ์์ A์ 0๋ฒ์งธ index ๊ฐ์ธ 2๊ฐ ๋ค์ด์จ๋ค. A[j]๋ 2๊ฐ ๋๊ณ C[A[j]]๋ C[2]๊ฐ ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ๊ธฐ์กด C[2]์ ๊ฐ์ธ 0์๋ค 1์ ๋ํด์ 1์ด ๋๋ค.
- ๊ทธ๋ค์์ 1๋ฒ์งธ index์ ๊ฐ์ธ 5๊ฐ ๋ค์ด์ค๊ณ , ์ด๋ C[5]์ 1์ ๋ํ๊ฒ ๋๋ค.
...
์ด๋ฐ ์์ผ๋ก ์งํํ๋ค๋ณด๋ฉด 0์ด ๋ช๊ฐ์ธ์ง, 1์ด ๋ช๊ฐ์ธ์ง...k๊ฐ ๋ช๊ฐ์ธ์ง C ๋ฆฌ์คํธ๋ฅผ ํตํด์ ์ ์ ์๊ฒ ๋๋ค.
- ๋ผ์ธ 5~6: C ๋ฆฌ์คํธ์ element๋ค์ ๋์ ๊ฐ์ผ๋ก ๋ฐ๊พผ๋ค. 0๋ฒ์งธ index๋ ๊ทธ๋๋ก ๋๊ณ , 1๋ฒ์งธ index๋ ์ด์ ๊ฐ์ ์์ ์ ๊ฐ์ ๋ํ๋ค 2+0 = 2, 2๋ฒ์งธ index๋ ์ด์ ๊ฐ์ ์์ ์ ๋ํ๋ค 2+2=4....์ด๋ ๊ฒ ๋ํ๋ค ๋ณด๋ฉด C์ ๋งจ ๋ง์ง๋ง element๋ ๋น์ฐํ๊ฒ๋ A์ ๊ธธ์ด๊ฐ ๋๋ค.
-
๋ผ์ธ 7~9: ๋ง์ง๋ง for loop์์๋ C๋ก ์ ๋ ฌ๋ B ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด๋ธ๋ค. A์ ๊ฐ์ ๋ณด๊ณ ๊ทธ ๊ฐ์ index ์ผ์์ C์ ๊ฐ์ ๋ณธ๋ค. C์ ๊ฐ์ index์ผ์์ A์ ๊ฐ์ B์ ๋ฃ๊ณ , ๋์ C์ ๊ฐ์ -1 ํด์ค๋ค. ๋ง์ด ์ด๋ ต๊ธฐ ๋๋ฌธ์ ํ ๋จ๊ณ์ฉ ์ดํด๋ณด์
- A[0]์ ๊ฐ 2๋ฅผ ๋ณด๊ฒ๋๋ค. ์ด ๊ฐ์ C์ index๋ก ์ฌ์ฉํ๋ค C[2].
- C[2]์ ๊ฐ์ 4์ด๊ธฐ ๋๋ฌธ์ B[4]์ A[0]์ ๊ฐ์ธ 2๋ฅผ ๋ฃ๊ฒ ๋๋ ๊ฒ์ด๋ค. B[C[A[j]]] ๊ฐ ์ด๋ฌํ ์๋ฏธ๋ฅผ ๊ฐ์ก๋ค. (์ค์ ๋ก๋ index๊ฐ 0๋ถํฐ ์์์ด๊ธฐ ๋๋ฌธ์ B[C[A[j]]-1]์ ํด์ค์ผ ํ๋ค)
- ๊ทธ ๋ค์์ 2๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋์ ๊ฐ์ ํ๋ ์ค์ฌ์ค์ผ ํ๋ค. ๊ทธ๋์ C[2] -= 1์ ํ๋ค
loop์ ํ๋ฒ ๋๋๋ง๋ค ์ด๋ฌํ ๋์์ ์งํํ๊ฒ ๋๊ณ , A์ ๋ง์ง๋ง element๋ฅผ B์ ๋ฃ์ ๋๊น์ง ์งํ์ด ๋๋ค.
Timeย Complexityย &ย inplace,ย stableย ์ฌ๋ถ
- ๋ผ์ธ 1~2๋ 0~k์ด๊ธฐ ๋๋ฌธ์
O(k)
์ด๋ค - ๋ผ์ธ 3~4๋ n๊น์ง์ฌ์
O(n)
์ด๋ค - ๋ผ์ธ 5~6์ k๊น์ง์ฌ์
O(k)
์ด๋ค - ๋ผ์ธ 7~9๋ n๊น์ง์ฌ์
O(n)
์ด๋ค
์๊ฐ๋ณต์ก๋๋ฅผ ๋ค ๋ํ๋ฉด O(n+k)
๊ฐ ๋๋ค. ๋ง์ฝ k=O(n) ์ด๋ฉด counting sort์ ์๊ฐ๋ณต์ก๋๋ O(n)
์ด ๋๋ค. ์ ๋ ฌ์ ํ๋ ๊ฒ์ด ์ด๋ ๊ฒ ๋น ๋ฅผ ์ ์๋ ์ด์ ๋ counting sort๋ ๋น๊ต๋ฅผ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง, k์ ๊ฐ์ด ๋๋ฌด ์ปค์ง๋ฉด ์ผ๋ฐ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋๋ ค์ง ์ ์๋ ๋จ์ ์ด ์๋ค.
Counting sort๋ ๊ธฐ์กด element๋ค์ ์์๋ฅผ ์งํค๋ฉด์ ์ ๋ ฌ์ ์ํค๊ธฐ ๋๋ฌธ์ stable
sort๋ก ๋ถ๋ฅ๋๋ค. ํ์ง๋ง, ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ in-place
์๊ณ ๋ฆฌ์ฆ์ ์๋๋ค.
Python Code
def couting_sort(A, k):
B = [0] * len(A)
C = [0] * (k+1)
for i in range(len(A)): # ๊ฐ element๊ฐ ๋ช๊ฐ์๋์ง C์ ์ ์ฅํ๋ค
C[A[i]] += 1
for i in range(1,len(C)): # C๋ฅผ ๋์ ๊ฐ์ผ๋ก ๋ฐ๊พผ๋ค
C[i] += C[i-1]
for i in range(len(A)): # C๋ฅผ indexingํด์ B์ ์ ์ฅํ๋ค
B[C[A[i]]-1] = A[i]
C[A[i]] -= 1
return B
counting_number = [1, 0, 3, 1, 0, 2, 5, 2, 1, 4]
print(counting_number)
count = couting_sort(counting_number, max(counting_number))
print(count)