티스토리 뷰

Algorithm/Sort

계수 정렬 (Counting Sort)

기내식은수박바 2020. 12. 24. 13:58
반응형

소개

  • 요소 값들끼리 서로 비교하지 않고 정렬하는 알고리즘이다.
  • 배열 내 최대 값 + 1 만큼의 길이 배열이 필요하기 때문에 메모리가 낭비될 수 있다.
  • 애니메이션 : URL

 

 

 

과정

1. 먼저 배열 내에 원소 값들의 갯수를 저장하는 카운팅 배열 (Counting Array) 를 만든다.

 

2. Counting Array (c[])의 요소들에 대해서 직전 요소들의 값을 더해준다.

 

3. 입력 배열과 동일한 크기의 출력 배열 (b[])을 만들고, 입력 배열의 역순으로 출력 배열에 요소들을 채워 넣어준다.

  • 여기서 우리는 두 값을 비교하는 과정 없이 정렬이 수행되는 것을 알 수 있다.

 

 

코드

public static void main(String[] args) {
	final int MAX = 5;
	int[] nums = { 1, 0, 1, 5, 4, 3, 1, 4, 5, 2, 1 };
	int len = nums.length;
	int[] counts = new int[MAX + 1];
	int[] sorted = new int[len];

	for (int i = 0; i < len; ++i) {
		++counts[nums[i]];
	}

	for (int i = 1; i <= MAX; ++i) {
		counts[i] += counts[i - 1];
	}

	for (int i = len - 1; i >= 0; --i) {
		sorted[counts[nums[i]]] = nums[i];
		--counts[nums[i]];
	}
}

 

 

결과

  • 100은 아직 정렬되지 않은 공간을 의미한다.

 

 

계산 복잡도

Time Complexity : 배열을 모두 훑어야 하므로 \(O(N)\) 이다.

  • Best : \(O(N)\)
  • Average : \(O(N)\)
  • Worst : \(O(N)\)

Space Complexity : 배열내 요소의 최대 값을 \(K\) 라고 할 때, \(K + 1\) 길이를 가진 Counting Array가 필요하므로 \(O(K)\) 이다.

반응형

'Algorithm > Sort' 카테고리의 다른 글

기수 정렬 (Radix Sort)  (0) 2023.10.03
정렬 기법 비교  (0) 2021.10.02
퀵 정렬 (Quick Sort)  (0) 2020.12.24
힙 정렬 (Heap Sort)  (2) 2020.12.24
병합 정렬 (Merge Sort)  (0) 2020.12.24
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함