출처: https://www.whatwant.com

 

이번에 살펴볼 Sorting algorithm은 앞에서 공부한 것들과 궤를 달리한다.

 

지금까지 공부한 것은 비교(comparison) 기반의 정렬이었지만

이번에는 counting 방식으로 정렬을 하는 계수 정렬(Counting sort)이다.

 

① basic counting sort

  - 비교 행위 없이 입력값 하나씩 읽어가며 개수만 세는 것으로 정렬이 된다.

 

출처: https://www.whatwant.com

 

② extra memory

  - 개수를 세기 위한 C(count array)가 추가로 필요하다. (= in place 알고리즘이 아니다!)

 

③ No stable

  - 입력값의 순서가 유지되는 것을 "stable 하다"고 한다.

 

  - 위 그림에서 3개의 "3" 입력값에 대해서 살펴보면,

    . (빨간색) index 값으로 표현해보면 '3-3', '6-3', '8-3'이라고 할 수 있다. 각 '3'은 다른 '3'이다.

    . 이 때, 출력값(output array)에서 '5-3', '6-3', '7-3'이 있는데,

    . 입력값의 순서가 유지된 것이라고 할 수 있을까?

 

출처: https://www.whatwant.com

 

  - Counting sort는 stable 할 수 없는 algorithm 이다.

 

④ Stabled(Advanced) Counting Sort

  - Counting sort 를 Stable 하도록 만들 수 있다.

 

  - Encoding ..... 기존 count array를 기반으로 누적값을 저장하는 C' array를 만들어줘야 한다.

 

출처: https://www.whatwant.com

 

  - Decoding ..... 누적값을 갖고 있는 C' array와 입력값(A array)를 가지고 출력값(B array)를 만들어준다.

    . 입력값의 제일 끝에서 부터 역으로 하나씩 처리하는 방식이다.

 

출처: https://www.whatwant.com

 

    . 하나 더 해보면, 다음과 같다.

 

출처: https://www.whatwant.com

 

    . 그 다음 "3" 값을 주의 깊게 봐야 한다.

      왜냐하면, 처음에 했던 "3"과 이번에 해야하는 "3"은 다른 "3"이기 때문이다.

 

출처: https://www.whatwant.com

 

    . 뭔가 신기하게 보일 수도 있긴 하지만... 그래서 뭐?

    . 입력값(A array)의 3의 순서에 따라 출력값(B array)의 순서가 정해진다. → Stable 하다 !!!

 

⑤ Pseudo code

  - 왠지 복잡해보이지만, 복잡하지 않은 코드이다.

 

출처: https://www.whatwant.com

 

  - 변수 (메모리) 모습을 그려보면 다음과 같다.

 

출처: https://www.whatwant.com

 

  - 여기에서 k는 입력값의 종류(개수)를 의미한다.

  - 코드를 분석해보면 다음과 같다.

 

출처: https://www.whatwant.com

 

⑥ Running Time

  - 실행 시간은 선형이다.

 

출처: https://www.whatwant.com

 

  - 정리해보면 다음과 같다.

 

출처: https://www.whatwant.com

 

 

그 이름에 걸맞게 입력값을 하나씩 세기만 하면 되는 시간인 것이다 !!!

즉, 앞에서 살펴본 "Lower bounds for (comparison) sort" 제약에 해당하지 않는다 !!!

 

반응형

+ Recent posts