Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- BFS(Breadth First Search)
- 백준 2493번
- 동적 프로그래밍(Dynamic Programming)
- 이분 탐색(Binary Search)
- 백준 2812번
- 백준 1948번
- 분할 정복(Divide and Conquer)
- 위상 정렬(Topology Sort)
- 백준 18352번
- 그래프(Graph)
- 다익스트라 알고리즘(Dijkstra Algorithm)
- 백준 21606번
- DFS
- 트리(Tree)
- 알고리즘 개념
- 백준 10000번
- 백준 17608번
- 큐(Queue)
- 백준 1707번
- BFS
- 백준 9012번
- 그리디 알고리즘(Greedy Algorithm)
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- 이분 그래프(Bipartite Graph)
- 백준 2504번
- DFS & BFS
- 스택(Stack)
- 백준 2261번
- 위상 정렬(Topological Sort)
- DFS(Depth First Search)
Archives
- Today
- Total
Always Be Wise
정렬 알고리즘 - 계수 정렬(Counting Sort) 본문
728x90
원소들의 순서를 결정하기 위해 원소들이 몇 개씩 있는지 세어서 적절한 위치에 선형 시간에 정렬하는 알고리즘을
의미한다. 비교 기반 정렬 알고리즘과 다르게 직접 데이터의 값을 비교하지 않습니다.
- 최초 배열 arr에 존재하는 값의 각 원소의 개수를 세어줄 새로운 배열 count를 만들어줍니다.
- count 배열의 원소를 누적합 값으로 갱신해줍니다.
- arr의 길이와 같은 result 배열을 만들어줍니다.
- arr의 각 원소의 값을 count의 인덱스로 사용해 값을 가져온 후, 해당 값을 다시 result의 인덱스로
- 사용해 arr의 값을 저장합니다.
- count[arr[i]]의 값을 하나 줄여줍니다.
- 위 과정을 반복합니다.
시간복잡도는 **O(n + k)**입니다. k가 충분히 작을 경우 시간복잡도가O(n)이 되겠지만,
k값이 커질 경우 k가 시간복잡도를 지배하게 됩니다. 공간복잡도는 O(k)입니다.
장점
- 선형 시간에 정렬이 가능하다.
단점
- 정수나, 정수로 표현할 수 있는 자료에 대해서만 적용 가능하다.
- 각 항목의 발생 횟수를 기록해야 하기 때문에 정수로 인덱스 되는 카운트들의 배열(메모리) 사용한다.
- 카운트를 위한 충분한 공간을 할당하기 위해서는 집합 내의 가장 큰 정수를 알아야한다.
def counting_sort(arr):
count = [0] * (max(arr) + 1)
for num in arr:
count[num] += 1
for i in range(1, len(count)):
count[i] += count[i-1]
result = [0] * (len(arr))
for num in arr:
idx = count[num]
result[idx - 1] = num
count[num] -= 1
return result
'기술 관련 정리' 카테고리의 다른 글
객체 지향 프로그래밍 (0) | 2022.04.27 |
---|---|
트랜잭션이란? (0) | 2022.04.12 |
정렬 알고리즘 - 힙 정렬(Heap Sort) (0) | 2022.04.09 |
정렬 알고리즘 - 병합 정렬(Merge Sort) (0) | 2022.04.09 |
정렬 알고리즘 - 퀵 정렬(Quick Sort) (0) | 2022.04.09 |
Comments