티스토리 뷰
| O(n) 정렬
비교 정렬의 하한은 O(nlogn)이지만 입력된 자료의 원소가 제한적인 성질을 만족하는 경우 O(n) 정렬이 가능하다. 대표적인 O(n) 정렬의 알고리즘으로는 Counting Sort와 Radix Sort가 있다.
| Counting Sort
일반적으로 정수 또는 문자를 정렬하는 경우 많이 사용되는 방법으로, 원소의 범위가 제한적일 때 원소의 개수를 세어 정렬하는 방법이다. 개수를 셀 배열과 정렬된 결과가 저장될 배열이 추가로 필요하다. 다양한 구현 방법이 있지만, Radix Sort와 연관된 버전으로 알아보자.
기본 구현 방법은 아래와 같다.
1. 각 원소의 개수를 저장할 count 배열을 준비한다.
2. 정렬한 배열에 대하여 각 원소의 개수를 세어 count 배열에 저장한다.
int arr_len = 20, count_arr_len = 6; // 배열 arr에 등장하는 원소의 범위가 (0~5) 라고 가정
int i;
for(i=0; i<count_arr_len; i++) count[i] = 0; // 배열 초기화
for(i=0; i<arr_len; i++) count[arr[i]]++; // 카운팅
3. count의 누적합을 구한다.
4. count 배열과 원래 배열 arr을 이용하여 정렬된 결과 sorted_arr 배열을 구한다.
for(i = 1; i<count_arr_len; i++) count[i] += count[i-1]; // 누적합
for(i = arr_len - 1; i>=0; i--) {
sorted_arr[--count[arr[i]] = arr[i];
}
정리하자면 아래와 같이 구현할 수 있다.
// arr 원소의 범위를 (0~5) 라고 가정
int arr_len = 20, count_arr_len = 6;
int i;
for(i=0; i<count_arr_len; i++) count[i] = 0; // 배열 초기화
for(i=0; i<arr_len; i++) count[arr[i]]++; // 카운팅
for(i = 1; i<count_arr_len; i++) count[i] += count[i-1]; // 누적합
for(i = arr_len - 1; i>=0; i--) {
sorted_arr[--count[arr[i]] = arr[i];
}
이와 연계한 Radix Sort는 아래 포스트를 참고한다.
https://googleyness.tistory.com/entry/Radix-Sort-%EA%B8%B0%EC%88%98-%EC%A0%95%EB%A0%AC
'IT > 자료구조, 알고리즘' 카테고리의 다른 글
Merge Sort (병합/합병정렬) (0) | 2022.10.18 |
---|---|
Radix Sort (기수 정렬) (0) | 2022.09.27 |
Data Structure in C++ - Hash (0) | 2022.08.31 |
Data Structure in C++ - Heap (0) | 2022.08.29 |
Data Structure in C++ - Tree (0) | 2022.08.29 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 내돈내산
- coding interview
- 맛집
- LeetCode
- algorithm
- Medium
- 속초
- 러스트 기초
- interview question
- 반드시 알아야 할 자료구조
- 트리
- 러스트
- Tree
- 알고리즘
- Interview
- 자료구조
- 러스트 입문
- Problem Solving
- 솔직후기
- 리트코드
- 코딩인터뷰
- C++
- 인터뷰
- 기술면접
- DP
- PS
- rust
- 속초 맛집
- 러스트 배우기
- ProblemSolving
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함