728x90
간만에 하는 블로깅이다.
블로그를 꾸준히 써야한다는 건 머리로는 알고 있는데, 막상 일에 치이다보면 어느새 까먹곤 한다. 🥲
계수정렬이란?
계수정렬은 Count Sorting이라 불리는 알고리즘이다.
그 이유는 배열 내에 있는 데이터들의 개수를 세서, 별도의 인덱싱 배열에 카운팅을 해두고 그 카운팅된 수를 기반으로 조건에 따라 출력하기 때문이다.
퀵, 병렬, 힙 정렬보다 빠른 알고리즘으로 볼 수 있지만, 단순히 개수를 세는 방식이기 때문에 데이터의 케이스가 너무 다양한 경우에는 오히려 효율이 떨어지는 정렬 알고리즘이라고 볼 수 있다.
즉, 데이터 케이스가 다양하지 않은 경우에만 적용해야 효과적인 알고리즘이라고 보면 된다.
시간복잡도
- O(N)
구현방법
- 나동빈님의 알고리즘 강의를 통해 공부하고 있어서, C로 작성된 코드를 별도로 Java와 Python을 이용해 구현해보겠다.
- 아래는 C로 구현한 코드
#include <stdio.h>
int main(void) {
int count[5];
int array[20] = {
1, 3, 2, 4, 3, 2, 3, 4, 5, 2, 1, 2, 3, 4, 4, 5, 2, 3, 1, 5
};
for(int i = 0; i < 5 ; i++) {
count[i] = 0;
}
for(int i = 0; i < 20; i++) {
count[array[i] - 1]++;
}
for(int i = 0; i < 5; i++) {
if(count[i] != 0) {
for (int j = 0; j < count[i]; j++) {
printf("%d ", i + 1);
}
}
}
return 0;
}
- Java (편의상 main 메소드만)
public static void main(String args) {
int[] count = new int[5];
int[] array = {
1, 3, 2, 4, 3, 2, 3, 4, 5, 2, 1, 2, 3, 4, 4, 5, 2, 3, 1, 5
}
for(int i = 0; i < count.length(); i++) {
count[i] = 0;
}
for(int i = 0; i < array.length(); i++) {
count[array[i] - 1]++;
}
for(int i = 0; i < count.length(); i++) {
if(count[i] != 0) {
for(int j = 0; j < count[i]; j++) {
system.out.printf("%d", i + 1);
}
}
}
}
- Python
count=[0] * 5
array=[1, 3, 2, 4, 3, 2, 3, 4, 5, 2, 1, 2, 3, 4, 4, 5, 2, 3, 1, 5]
for i in range(len(array)):
count[array[i] - 1] += 1
for i in range(len(count)):
if(count[i] != 0):
for j in range(count[i]):
print(i + 1, end="")
대충 잘 되는 것 같다.
나중에 해당 정렬을 활용해서 문제나 한 번 풀어봐야지.
728x90
'알고리즘' 카테고리의 다른 글
[백준] 2750 수 정렬하기 (1) | 2025.05.01 |
---|---|
[백준] 1874 스택수열 (Python) (1) | 2024.09.01 |
[백준] 1002 터렛 (Python) (1) | 2024.08.26 |
[백준] 2941 크로아티아 알파벳 (Java) (0) | 2022.08.10 |
[백준] 1712 손익분기점 (Java) (0) | 2022.08.09 |