본문 바로가기
Algorithm

계수 정렬(Counting Sort)

by JungSeung 2023. 5. 11.
728x90

/

Comparison Sort

N개 원소의 배열이 있을 때, 이를 모두 정렬하는 가짓수는 N! 이다

따라서, Comparison Sort를 통해 생기는 트리의 말단 노드가 N! 이상의 노드 갯수를 갖기 위해서는, 2^h >= N! 를 만족하는 h를 가져야 하고, 이 식을 h > O(nlgn)을 가져야 한다. (h는 트리의 높이,,, 즉 Comparison sort의 시간 복잡도이다)

이런 O(nlgn)을 줄일 수 있는 방법은 Comparison을 하지 않는 것

/

 

Counting Sort 과정

시간 복잡도 : O(n + k) -> k는 배열에서 등장하는 최대값

공간 복잡도 : O(k) -> k만큼의 배열을 만들어야 한다.

Counting이 필요 : 각 숫자가 몇 번 등장했는지 센다.

 

JavaScript 코드

function countingSort(arr, min, max) {
  let i, j = 0;
  const count = [];

  for (i = min; i <= max; i++) {
    count[i] = 0;
  }
  for (i = 0; i < arr.length; i++) {
    count[arr[i]]++;
  }
  for (i = min; i <= max; i++) {
    while (count[i] > 0) {
      arr[j] = i;
      j++;
      count[i]--;
    }
  }
  return arr;
}
  • 첫번째 for문에서 0으로 카운트 배열 초기화.
  • 두번째 for문에서 각 요소의 발생 횟수를 계산합니다.
  • 마지막 for문에서 출력 시퀀스에서 각 요소의 올바른 위치를 포함하도록 카운트 배열 수정.

 

  • 사용 : 정렬하는 숫자가 특정한 범위 내에 있을 때 사용
    (Suffix Array 를 얻을 때, 시간복잡도 O(nlgn)으로 얻을 수 있다.)
  • 장점 : O(n) 의 시간복잡도
  • 단점 : 배열 사이즈 N 만큼 돌 때, 증가시켜주는 Counting 배열의 크기가 크다.
    (메모리 낭비가 심하다)

* 틀린 부분이 있다면 말씀 부탁드립니다!

 

728x90

'Algorithm' 카테고리의 다른 글

병합 정렬(Merge Sort)  (0) 2023.05.15
퀵 정렬(Quick Sort)  (0) 2023.05.12
삽입 정렬(Insertion Sort)  (2) 2023.05.10
선택 정렬(Selection Sort)  (0) 2023.05.09
거품 정렬(Bubble Sort)  (0) 2023.05.08