[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๊ณ์์ ๋ ฌ(Counting Sort)
Comparison Sort
๋ชจ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฐ์ด์ ์์๋ค์ ๊ฒ์ฌํ๋ ๊ณผ์ ์ด ํฌํจ๋์ด ์๋ค. ๊ฒฐ๊ตญ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ค์ ๋น๊ตํ๊ธฐ ์ํด์๋ Decision Tree ๋ฅผ ๋ง๋ค์ด ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฐ์ ธ๋ณผ ์ ์๋๋ฐ, ์ด๋ก๋ถํฐ ์ฐ๋ฆฌ๋ decision tree ์ ๋์ด์ธ logn ๋งํผ ๋น๊ต์ฐ์ฐ์ด ์ผ์ด๋๋ค๋ ๊ฒ์ ์์๋ผ ์ ์๋ค. ๋น๊ต์ฐ์ฐ์ ์๊ฐ ๋ณต์ก๋๋ ี(n) ์ด๋ฏ๋ก ๋น๊ต์ฐ์ฐ์ ์ฌ์ฉํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฌด๋ฆฌ ๋นจ๋ผ๋ ี(nlogn)๋ณด๋ค ๋น ๋ฅผ ์๊ฐ ์๋ค.
์ฐ๋ฆฌ๊ฐ ์์ฃผ ์ธ๊ธํ๋ ๋น ๋ฅธ ์ ๋ ฌ์๊ณ ๋ฆฌ์ฆ์ธ ํต์ํธ, ๋จธ์ง์ํธ ์ญ์ ี(nlogn)์ ๋ณต์ก๋๋ก ๊ฐ์ง๋ค.
Counting Sort
๊ทธ๋ ๋ค๋ฉด ๋ง์ฝ ๋น๊ต์ฐ์ฐ์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ด๋จ๊น? ๋น๊ต์ฐ์ฐ์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด Decision Tree ์ ์ ์ฝ์ฌํญ ์์ด ๋ ๋น ๋ฅธ ์ ๋ ฌ์ด ๊ฐ๋ฅํ์ง ์์๊น?
๊ณ์์ ๋ ฌ ํน์ ์นด์ดํ
์ํธ๋ ์ด๋ฐ ์์ด๋์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์ ๋์จ ี(n+๋ฐ์ดํฐ์ ์ต๋๊ฐ k)
์ ์๋๊ฐ ๋ณด์ฅ๋๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์นด์ดํ
์ํธ๋ ์ด๋ฆ ๊ทธ๋๋ก ๋ฐฐ์ด ๋ด์ ํน์ ํ ๊ฐ์ด ๋ช๋ฒ ๋ฑ์ฅํ๋์ง์ ๋ฐ๋ผ ์ ๋ ฌ์ ์ํํ๊ธฐ ๋๋ฌธ์ ๋น๊ต์ฐ์ฐ์ด ์ฌ์ฉ๋์ง ์๋๋ค.
Algorithm Concept
์นด์ดํ ์ ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ผ๋ก ์ํ๋๋ค.
- ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด A์ ์์๊ฐ๋ค์ ๋ฑ์ฅํ์๋ฅผ ์ ์ฅํ ๋ฐฐ์ด B์ ์ต์ข ์ ์ผ๋ก ์ ๋ ฌ๋ ๊ฐ๋ค์ ๋ด์ ๋ฐฐ์ด C๋ฅผ ์ค๋นํ๋ค.
- ์
๋ ฅ๋ฐญ์ ๋ฐฐ์ด์์ ๊ฐ์ ํ๋์ฉ ๊บผ๋ด์ ํด๋น ๊ฐ์ ๋ฐฐ์ด B์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํด B ์ ์์ ๊ฐ์ ํ๋ ์ฆ๊ฐ์ํจ๋ค.
(B[A[i]]++)
- B๊ฐ ์์ฑ๋๋ฉด B์ ๊ฐ ์์๋ค์ ๋์ ํฉ์ผ๋ก ๊ฐฑ์ ํ๋ค.
B[i] = B[i] + B[i-1]
- A ์ ๊ฐ์ฅ ๋ค์์ ๋ถํฐ ๊ฐ์ ํ๋์ฉ ๊บผ๋ด์ ํด๋น๊ฐ์ B์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๊ณ ์ฐธ์กฐ๋ B์ ๊ฐ์ ๋ฐฐ์ด C์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํด์ ๋ฐฐ์ด C์ A์์ ๊บผ๋ธ ๊ฐ์ ๋ฃ๋๋ค.
C[B[A[i]]] = A[i]
- ์ฌ์ฉ๋ B์ ๊ฐ์ ํ๋ ๊ฐ์์ํจ๋ค.
(B[A[i]]--)
- A์ ๋ชจ๋ ์์์ ๋ํด 4๋ฒ, 5๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
๋ฐฐ์ด์ด ์ฌ๋ฌ๊ฐ ์ฌ์ฉ๋๊ณ ์๋ก๊ฐ ์๋ก๋ฅผ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๋ ์ํฉ์ด๋ ๊ธ๋ก๋ ์ดํดํ๊ธฐ๊ฐ ์ฝ์ง ์๋ค. ๊ทธ๋ฆผ์ผ๋ก ์์๋ณด์.
Example
์ผ๋จ ๋ฐฐ์ด A๋ฅผ ์ ๋ ฅ๋ฐ์๊ณ , ๋ฐฐ์ด B์ C๋ฅผ ์ค๋นํ๋ค.
Phase 1
์ ์ผ ๋จผ์ , A๋ฅผ ์ํํ๋ฉด์ A์ ๋ค์ด๊ฐ ์๋ ๊ฐ๋ค์ ๋ฑ์ฅ ํ์๋ฅผ ๋ฐฐ์ด B์ ์ ์ฅํด์ฃผ์๋ค. ์๋ฅผ ๋ค์ด A์์ 0์ด๋ผ๋ ๊ฐ์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ B์ 0๋ฒ ์ธ๋ฑ์ค๋ 0์ด๋๊ณ , 3์ ์ด 2๋ฒ ๋ฑ์ฅํ๊ธฐ ๋๋ฌธ์ B์ 3๋ฒ ์ธ๋ฑ์ค๋ 2๋ก ๊ฑ์ ๋์๋ค.
์ฃผ๋ชฉํ ์ ์ B์ ๋ฐฐ์ด๊ธธ์ด๋ A์ ์๋ ์ต๋๊ฐ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค๋ ๊ฒ์ด๋ค. ์ดํ์ ์ด๊ฒ์ด ์ฑ๋ฅ์ ์ด๋ค ์ํฅ์ด ์์์ง ๋ ผ์ํด๋ณด์.
Phase 2
B ๋ฐฐ์ด์ ๊ฐ๋ค์ 1๋ถํฐ ๋ง์ง๋ง ๊ฐ๊น์ง ๋ฐ๋ก ์ด์ ๊ฐ๊ณผ ๊ณ์ ๋ํด์ ๋์ ํฉ์ผ๋ก ๋ง๋ค์ด์ค๋ค.
Phase 3
- ๋ฐฐ์ด A์ ๊ฐ์ฅ ๋ค์์ ๋ถํฐ ๊ฐ์ ํ๋์ฉ ๊บผ๋ธ๋ค. ์ด๋ฒ์ ๊บผ๋ธ ๊ฐ์ 6์ด๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ ๋ฐฐ์ด B์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํด์ ์ ๊ทผํ๋ค.
- ๋ฐฐ์ด B์ 6๋ฒ ์ธ๋ฑ์ค์ ์๋ ๊ฐ์ 6์ด๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ ์ฌ์ฉํด์ C์ ์ ๊ทผํ๋ค. ์ด๊ฒ์ ๋ฐฐ์ด A์๋ 6๋ณด๋ค ๊ฐ๊ฑฐ๋ ์์ ๊ฐ์ด ์ด 6๊ฐ๊ฐ ์์์ ์๋ฏธํ๋ค.
- ๋ฐฐ์ด C์ 6๋ฒ์งธ ์์์ 6์ ๋ฃ๋๋ค. ๋ฐฐ์ด A์ 6๋ณด๋ค ๊ฐ๊ฑฐ๋ ์์ ๊ฐ์ด 6๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ต์ข ๋ฐฐ์ด์ 6๋ฒ์งธ ์นธ์ ๋ฃ์ด์ฃผ๋ฉด 6๋ณด๋ค ์์ ๊ฐ์ ๋ชจ๋ ์ด ์ธ๋ฑ์ค์ ์์ ์์นํ๊ณ ํฐ ๊ฐ๋ค์ ๋ค์ ์์นํ๊ฒ ๋ ๊ฒ์ด๋ค.
- ๋ฐฐ์ด B์ 6๋ฒ ์ธ๋ฑ์ค์ ๊ฐ์ ํ๋ ์ค์ฌ์ค๋ค.
Phase 4
- A ๋ฐฐ์ด์์ ๋ค์ ๊ฐ์ธ 1์ ๊บผ๋ธ๋ค.
- B ๋ฐฐ์ด์ 1๋ฒ ์ธ๋ฑ์ค์๋ 2๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์
- C ๋ฐฐ์ด์ 2๋ฒ์งธ ์์น์ A์์ ๊บผ๋ธ ๊ฐ์ธ 1์ ๋ฃ์ด์ฃผ๊ณ ,
- B ๋ฐฐ์ด์ 1๋ฒ ์ธ๋ฑ์ค์ ์นด์ดํธ๋ฅผ ํ๋ ์ค์ฌ์ค๋ค.
Phase 5
- A ๋ฐฐ์ด์์ ๋ค์ ๊ฐ์ธ 5๋ฅผ ๊บผ๋ธ๋ค.
- B ๋ฐฐ์ด์ 5๋ฒ ์ธ๋ฑ์ค์๋ 5๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์
- C ๋ฐฐ์ด์ 5๋ฒ์งธ ์์น์ A์์ ๊บผ๋ธ ๊ฐ์ธ 5์ ๋ฃ์ด์ฃผ๊ณ ,
- B ๋ฐฐ์ด์ 5๋ฒ ์ธ๋ฑ์ค์ ์นด์ดํธ๋ฅผ ํ๋ ์ค์ฌ์ค๋ค.
Phase 6
- A ๋ฐฐ์ด์์ ๋ค์ ๊ฐ์ธ 3๋ฅผ ๊บผ๋ธ๋ค.
- B ๋ฐฐ์ด์ 5๋ฒ ์ธ๋ฑ์ค์๋ 4๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์
- C ๋ฐฐ์ด์ 4๋ฒ์งธ ์์น์ A์์ ๊บผ๋ธ ๊ฐ์ธ 3์ ๋ฃ์ด์ฃผ๊ณ ,
- B ๋ฐฐ์ด์ 3๋ฒ ์ธ๋ฑ์ค์ ์นด์ดํธ๋ฅผ ํ๋ ์ค์ฌ์ค๋ค.
Phase 7
- A ๋ฐฐ์ด์์ ๋ค์ ๊ฐ์ธ 1๋ฅผ ๊บผ๋ธ๋ค.
- B ๋ฐฐ์ด์ 1๋ฒ ์ธ๋ฑ์ค์๋ 1์ด ๋ค์ด์๊ธฐ ๋๋ฌธ์
- C ๋ฐฐ์ด์ 1๋ฒ์งธ ์์น์ A์์ ๊บผ๋ธ ๊ฐ์ธ 1์ ๋ฃ์ด์ฃผ๊ณ ,
- B ๋ฐฐ์ด์ 1๋ฒ ์ธ๋ฑ์ค์ ์นด์ดํธ๋ฅผ ํ๋ ์ค์ฌ์ค๋ค.
Phase 8
- A ๋ฐฐ์ด์์ ๋ค์ ๊ฐ์ธ 3๋ฅผ ๊บผ๋ธ๋ค.
- B ๋ฐฐ์ด์ 3๋ฒ ์ธ๋ฑ์ค์๋ 3์ด ๋ค์ด์๊ธฐ ๋๋ฌธ์
- C ๋ฐฐ์ด์ 3๋ฒ์งธ ์์น์ A์์ ๊บผ๋ธ ๊ฐ์ธ 3์ ๋ฃ์ด์ฃผ๊ณ ,
- B ๋ฐฐ์ด์ 3๋ฒ ์ธ๋ฑ์ค์ ์นด์ดํธ๋ฅผ ํ๋ ์ค์ฌ์ค๋ค.
์ ๋ ฌ ๋!
Implement
// k == max number
// n == number of data in A
void counting_sort(int A[], int B[], int C[]){
/* ์นด์ดํ
๋ฐฐ์ด 0์ผ๋ก ์ด๊ธฐํ */
for (int i = 0 ; i <= k ; i++){
B[i] = 0;
}
/* ์นด์ดํ
๊ฐ ๊ฐฑ์ */
for (int i = 1 ; i <= n ; i++){
B[A[i]] = B[A[i]] + 1;
}
/* ๋์ ํฉ ๊ณ์ฐ */
for (int i = 1 ; i <= k ; i++){
B[i] = B[i] + B[i-1];
}
/* ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๊ฐ ๋ฃ๊ธฐ */
for (int i = n ; i >= n ; i--){
C[B[A[i]]] = A[i];
B[A[i]] = B[A[i]] - 1;
}
}
Algorithm Analysis
์์ ์ ๊น ์ธ๊ธํ๋ ๊ฒ ์ฒ๋ผ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์น๋ช ์ ์ธ ๋จ์ ์ ์นด์ดํ ์ ์ํ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด ๊ฐ๋ค ์ค ์ต๋๊ฐ์ ์ํด ๊ฒฐ์ ๋๋ค๋ ๊ฒ์ด๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด์ ๊ฐ๋ค์ด (1, 100000) ์ด๋ผ๊ณ ํ๋ค๋ฉด, ์ด ๋ฐฐ์ด์ ๋ ๊ฐ์ ๊ฐ๋ง์ ๊ฐ์ง๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ ์นด์ดํ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ 100000์ผ๋ก ์ค์ ๋์ด์ผ ํ๋ค.
๋ํ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ ี(n * k) ๊ฐ ๋๋๋ฐ, ๋ฐฐ์ด์ ์ฐธ์กฐํ๋ ์ฐ์ฐ O(n) ์ด B ๋ฐฐ์ด์ ๊ธธ์ด์ธ k, ์ฆ ๋ฐฐ์ด ๋ด์ ์ต๋ ๊ฐ์ ๊ธธ์ด๋งํผ ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ ๋ ฅ๋ฐ์ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๊ฐ์๊ฐ k ๋ณด๋ค ์๋ค๋ฉด ๊ต์ฅํ ์ ์ฉํ ์๊ณ ๋ฆฌ์ฆ์ด ๋๊ฒ ์ง๋ง, k ๊ฐ ๋ ํฐ๊ฒฝ์ฐ์๋ ๋นํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด ๋ ์๋ ์๋ค.
'๐ฎ ์จ-์์ค > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๊ธฐ์์ ๋ ฌ(Radix Sort) (0) | 2021.07.18 |
---|---|
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํฉ๋ณ์ ๋ ฌ(Merge Sort) (0) | 2021.07.18 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํต์ ๋ ฌ(Quick Sort) (1) | 2021.07.18 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํ๋ก์ด๋-์์ ์๊ณ ๋ฆฌ์ฆ(Floyd-Warshall Algorithm) (0) | 2021.07.18 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ์์์ ๋ ฌ(Topological Sort) (0) | 2021.07.18 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote