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
- 코테준비
- 스택
- 분할정복
- 팀정렬
- 힙
- 연결리스트
- 코딩테스트
- collections.sort
- 큐
- 해시함수
- 우선순위 큐
- heap
- 백준
- MSA
- 파싱
- LinkedList
- divide and conquer
- 선택정렬
- stack
- 거품정렬
- 프로그래머스
- 자료구조
- 퀵정렬
- 트라이
- Timsort
- 스터디
- 15552번
- 코테
- 이진트리탐색
- 삽입정렬
Archives
- Today
- Total
Little bIT awesome
[Week1] 계수 정렬 (Counting Sort) 본문
Comparison Sort
N개 원소의 배열이 있을 때, 이를 모두 정렬하는 가짓수는 N!임
따라서, Comparison Sort를 통해 생기는 트리의 말단 노드가 N! 이상의 노드 갯수를 갖기 위해서는,
2^h >= N! 를 만족하는 h를 가져야 하고, 이 식을 h > O(nlgn)을 가져야 한다.
(h는 트리의 높이,,, 즉 Comparison sort의 시간 복잡도임)
이런 O(nlgn)을 줄일 수 있는 방법은 Comparison을 하지 않는 것
정렬하는 숫자가 특정 범위 안에 있을 때 사용함
Process
public static void countingSort(int[] arr, int n) {
// {5, 4, 3, 2, 1}
int[] buffer = new int[n];
int m = getMax(arr, n);
int[] count = new int[m + 1];
// 최댓값이 담길 수 있도록 사이즈 잡기
// count 배열의 값을 증가시켜주기
for (int i = 0; i < arr.length; i++) {
count[arr[i]]++;
}
// count == {0, 1, 1, 1, 1, 1}
// 누적합 구해주기
for (int i = 1; i < count.length; i++) {
count[i] += count[i - 1];
}
// count == {0, 1, 2, 3, 4, 5}
for (int i = arr.length - 1; i >= 0; i--) {
count[arr[i]]--;
buffer[count[arr[i]]] = arr[i];
}
}
시간복잡도
O(n + k) : k는 배열에서 등장하는 최댓값
공간복잡도
O(k) : k 만큼의 배열을 만들어야 함.
장점
O(n)의 시간복잡도
단점
배열 사이즈 N만큼 돌 때, 증가시켜주는 Count배열의 크기가 크다.
'코딩테스트 > 알고리즘 정리' 카테고리의 다른 글
[Week3] 이분 탐색 (Binary Search) (0) | 2024.02.15 |
---|---|
Collections.sort에 쓰이는 TimSort (0) | 2024.02.02 |
[Week1] 기수 정렬 (Radix Sort) (0) | 2024.01.31 |
[Week1] 힙 정렬 (Heap Sort) (1) | 2024.01.31 |
[Week1] 병합 정렬 (MergeSort) (0) | 2024.01.31 |