반응형
세 번째로 알아볼 정렬 알고리즘은 바로 계수 정렬!
계수 정렬은 수의 범위가 적을 때 사용하면 좋은 정렬 알고리즘으로 배열의 가장 큰 값에 따라 시간 복잡도가 달라진다.
배열의 가장 큰 값이 k라고 한다면 O(n+k)의 시간 복잡도를 갖는다.
즉, 입력에 비해서 원소들의 값의 범위가 적다면 계수정렬을 사용하는 것이 효율적인 방법이 될 수 있다!
방법
1. 입력된 배열중 가장 큰 값(k) 찾기
2. k+1 크기의 0으로 초기화된 배열 생성한다. 이는 입력된 배열의 원소가 각각 몇 개가 있는지 셀 배열이다.
3. 배열의 원소를 하나씩 검사하여 2번에서 생성한 배열의 인덱스에 해당하는 값을 1씩 올려준다.
(즉, 각 값이 몇 개가 나왔는지 카운팅 해준다.)
4. 각 인덱스를 값만큼 반복하여 출력한다.
예시
배열 : 4 3 2 3 0 1 2 5 4 1
1. 입력된 배열 중 가장 큰 값(k)은 5
2. 0으로 초기화된 6 크기의 배열을 생성한다.
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
0 | 0 | 0 | 0 | 0 | 0 |
3. 배열을 하나씩 확인하여 개수를 세어준다.
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
0 | 0 | 0 | 0 | 1 | 0 |
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
0 | 0 | 0 | 1 | 1 | 0 |
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
0 | 0 | 1 | 1 | 1 | 0 |
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
0 | 0 | 1 | 2 | 1 | 0 |
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
1 | 0 | 1 | 2 | 1 | 0 |
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
1 | 1 | 1 | 2 | 1 | 0 |
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
1 | 1 | 2 | 2 | 1 | 0 |
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
1 | 1 | 2 | 2 | 1 | 1 |
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
1 | 1 | 2 | 2 | 2 | 1 |
배열 : 4 3 2 3 0 1 2 5 4 1
index = 0 | index = 1 | index = 2 | index = 3 | index = 4 | index = 5 |
1 | 2 | 2 | 2 | 2 | 1 |
4. 각 인덱스를 값만큼 반복하여 출력한다.
0 1 1 2 2 3 3 4 4 5
깔끔하게 정리된 것을 확인할 수 있다.
구현(파이썬)
#https://teching.tistory.com/
def countingSort(list):
k = max(list)
cntNum = [0] * (k+1)
for n in list :
cntNum[n] += 1
new = []
for i in range(len(cntNum)):
new += [i]*cntNum[i]
return new
nums = [4, 3, 2, 3, 0, 1, 2, 5, 4, 1]
sortedNum = countingSort(nums)
print(sortedNum)
반응형
'알고리즘 테스트 > 이론' 카테고리의 다른 글
동적 계획법 (파이썬) (0) | 2022.02.07 |
---|---|
깊이 우선 탐색(DFS), 너비 우선 탐색(BFS) (0) | 2022.02.01 |
정렬 알고리즘 2 : 병합 정렬(합병 정렬, Merge sort) (0) | 2022.01.30 |
정렬 알고리즘 1 : 버블 정렬 (0) | 2022.01.30 |
에라토스테네스의 체(소수 판별 알고리즘) (0) | 2021.12.28 |