본문 바로가기

Theory/Algorithms

계수 정렬 (Counting Sort)

반응형

계수 정렬은 이름 그대로 배열의 원소를 각각 셈으로써 정렬하는 방식입니다. 데이터의 크기가 제한되어 있고 중복된 데이터가 많을 때 효과적인데요. 배열 [2,4,0,6,1,2,8,4,9] 예를 들어 한 번 살펴보겠습니다.

EXAMPLE

계수정렬은 먼저 배열의 가장 작은 값과 큰 값이 모두 담길 수 있는 리스트를 생성합니다.

0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 0 0 0 0

생성한 리스트에 데이터의 값과 동일한 인덱스의 값을 증가시킵니다. 

0 1 2 3 4 5 6 7 8 9
1 1 2 0 2 0 1 0 1 1

그 다음에는 리스트의 첫 번째 데이터부터 하나씩 출력합니다.

 

파이썬 코드

def counting_sort(array):
    count = [0] * (max(array) - min(array) + 1) # Count는 0으로 초기화
    for i in range(len(array)):
        ## 해당 index 값 증가
        count[array[i]] += 1
        
    ## 출력
    result = []
    for i in range(len(count)):
        for j in range(count[i]):
            result.append(i)

 

시간 복잡도

계수 정렬은 기존 정렬과 다르게 리스트를 새로 선언하므로 result 배열의 길이 n, 최대 수 k에 대해 $O(n+k)$의 공간 복잡도가 소요됩니다. 시간 복잡도 또한 배열의 길이 n과 선언한 리스트 k에 대해 for 루프를 수행하므로 $O(n+k)$가 소요됩니다. 

홍머스 정리

  • 중복된 값이 많을 때는 효과적일수도
  • 0과 9999 두 원소만 있는 배열에 대해서는...?

참조

반응형

'Theory > Algorithms' 카테고리의 다른 글

안정 정렬 vs 불안정 정렬  (0) 2021.02.22
병합 정렬 / 합병 정렬 (Merge Sort)  (0) 2021.02.22
퀵 정렬 (Quick Sort)  (0) 2021.02.21
삽입 정렬 (Insertion Sort)  (0) 2021.02.21
버블 정렬 (Bubble Sort)  (0) 2021.02.20