티스토리 뷰
목표
- Counting Sort에 대해 설명할 수 있다.
- Counting Sort 과정에 대해 설명할 수 있다.
- Counting Sort를 Python으로 구현할 수 있다.
- Counting Sort의 특징을 이해하여 시간 복잡도와 공간 복잡도를 계산할 수 있다.
요약
- 시간 복잡도가 O(n+k)로 매우 효율이 좋아보이는 정렬이다.
- 좋아보인다는 표현을 쓴 이유는 배열 내의 최댓값 k의 크기에 따라 오히려 효율이 나빠지기 때문이다.
- n이 10일 경우, k가 1000이라면 O(10 + 1000)이기 때문에 O(n^3)이나 다를바 없다.
- k에 따라서 메모리도 많이 사용하게 된다.
과정 (오름차순)
- 배열에 있는 숫자 중 가장 큰 값만큼의 배열을 만들어준다.
- 주어진 배열을 순회하면서 카운팅 배열의 인덱스에 맞는 값의 수를 하나씩 증가시킨다.
- 카운팅이 종료되면 누적합으로 바꿔준다.
- 정렬할 배열을 뒤에서 앞으로 순회하면서 새로운 정렬에 하나씩 넣어줄 것이다.
- 카운팅 배열에서 해당 숫자에 대한 값은 인덱스의 위치이다.
- 새로운 정렬의 인덱스에다가 해당 숫자의 값을 넣고 카운팅 배열의 값을 하나 줄인다.
- 4 ~ 6번 과정을 반복한다.
Python 코드
def countingSort(nums):
max_num = max(nums)
# 1. counting 배열을 생성하고 값을 증가시켜준다.
counts = [0] * (max_num + 1)
for num in nums:
counts[num] += 1
# 2. counting 배열을 누적합으로 바꿔준다.
for c in range(1, len(counts)):
counts[c] += counts[c - 1]
# 3. counting 배열의 뒤에서 부터 앞으로 순회하면서 새로운 배열에 값을 쌓아간다.
results = [0] * len(nums)
for n in range(len(nums) - 1, -1, -1):
results[counts[nums[n]] - 1] = nums[n]
counts[nums[n]] -= 1
return results
print(countingSort([5, 5, 3, 4, 19, 1, 0, 4, 1, 3, 0, 2, 4, 2, 3, 0]))
시간 복잡도
- Counting Sort의 경우 O(n + k)로 배열의 최댓값 k에 영향을 받는다.
공간 복잡도
k만큼의 배열을 만들어야 하기 때문에 O(k)이다.
특징
장점
- 배열의 최댓값 k가 배열의 길이 n 보다 작다면 시간 복잡도가 O(n)으로 효율이 좋다.
- 안정 정렬이다.
단점
- 최댓값 k가 배열의 길이 n보다 많이 크다면 효율이 좋지 않다.
- 정렬에 필요한 메모리가 많이 필요한 편이다.
Reference
반응형
'Programming > 알고리즘' 카테고리의 다른 글
해쉬 테이블 (Hash Table) (0) | 2021.06.10 |
---|---|
이분 탐색 (Binary Search) (0) | 2021.06.10 |
기수 정렬 (Radix Sort) (1) | 2021.06.10 |
힙 정렬 (Heap Sort) (0) | 2021.06.07 |
합병 정렬 (Merge Sort) (0) | 2021.06.07 |
댓글