본문 바로가기
컴퓨터공학/자료구조 및 알고리즘

Counting sort

by 유리병 2022. 7. 5.

지금까지 살펴본 알고리즘들은 원소들 간의 비교를 통해 정렬작업을 수행한다.

어떤 비교 정렬 알고리즘이라도 원소 n개를 정렬할 때, 최악의 경우 O(n log n)이상의 수행속도를 갖을 수 없다. 

 

그러나, counting sort는 비교 알고리즘이 아니기 때문에 O(n)에 수행이 가능하다. 

 

counting sort는 두 가지를 전제한다. 

    1) n개의 입력원소 모두가 0~k 사이의 정수이다. 

    2) k=O(n)이다. 즉 k가 n에 비해 압도적으로 크지 않다. 

 

counting sort는 각 입력원소 x에 대해 x보다 작은 원소의 갯수를 셈으로써, 출력배열에서 원소 x의 위치를 정해가며 정렬한다. 

 

counting_sort(ary,sorted_ary,k)
	//count를 위한 ary 초기화
    count_ary[0~k]
    for i=0 to k
        count_ary[i]=0

    for i=0 to ary.length
        count_ary[ary[i]]=count_ary[ary[i]]+1
    //이제 count_ary[i]=는 i와 같은 원소의 개수를 나타낸다.
    
    for i=1 to k
        count_ary[i]=count_ary[i]+count_ary[i-1]
    //count_ary[i]는 이제 값이 i보다 작거나 같은 원소의 개수를 나타낸다. 
    
    for i=A.length down to 1	//배열의 시작이 1이라고 가정한다
        sorted_ary[count_ary[ary[i]]]=ary[i]
        count_ary[ary[i]]=count_ary[ary[i]]-1

 

계수정령의 중요한 특징은 안정성을 갖는다는 것이다.

이는 출력 배열에서 값이 같은 숫자가 입력 배열에 있던 것과 같은 순서로 나타난다는 것을 뜻한다. 

즉, 두 숫자가 같을 때는 입력 배열에서 먼저 나타나는 것이 출력 배열에서도 먼저 나타난다. 

보통 안정성이라는 특성은 정렬되는 원소에 부속 데이터가 붙어 다닐 때 중요한 특성으로 간주된다. 

 

'컴퓨터공학 > 자료구조 및 알고리즘' 카테고리의 다른 글

Binary Search Tree  (0) 2022.07.08
Selection Problem, 중앙값과 순서통계량  (0) 2022.07.05
Quick sort  (0) 2022.07.04
HEAP  (0) 2022.07.01