// education

05. 정렬 알고리즘 3: 비비교 정렬 및 정렬 안정성 - 계수 정렬, 기수 정렬 및 Stable Sort

원소 간의 비교 연산 없이 선형 시간 $O(N)$에 정렬을 완료하는 **계수 정렬(Counting Sort)**과 기수 정렬(Radix Sort), 그리고 **정렬 안정성(Stable Sort)**을 다룹니다.


4. 실전 파이썬(Python 3) 알고리즘 구현 코드 및 라인별 주석 해설

본 레슨의 핵심 연산 매커니즘을 파이썬 3 환경에서 가장 효율적이고 직관적으로 구현한 실전 소스 코드입니다. 모든 주요 라인마다 상세한 한글 주석이 기재되어 있어 코드의 흐름을 쉽고 명확하게 이해할 수 있습니다.

def counting_sort(arr: list) -> list:
    """비교 연산 없는 선형 시간 O(N + K) 계수 정렬"""
    if not arr:
        return []
    
    max_val = max(arr)
    # 0부터 max_val 까지의 등장 빈도를 저장할 카운팅 배열 생성
    count = [0] * (max_val + 1)
    
    # 1. 입력 원소들의 빈도수 집계 (O(N))
    for num in arr:
        count[num] += 1
        
    # 2. 카운팅 배열을 바탕으로 정렬된 결과 배열 복원 (O(N + K))
    sorted_arr = []
    for num, cnt in enumerate(count):
        sorted_arr.extend([num] * cnt)  # 빈도수만큼 해당 숫자를 추가
    return sorted_arr

# 파이썬 sorted()의 Stable Sort 증명 예제
if __name__ == "__main__":
    nums = [4, 2, 2, 8, 3, 3, 1]
    print("계수 정렬 결과:", counting_sort(nums))

    # 객체 정렬 시 기존 입력 순서가 유지되는지 확인 (Stable Sort)
    students = [("김철수", 90), ("이영희", 85), ("박민수", 90)]
    # 점수(s[1]) 기준 오름차순 정렬 -> 김철수와 박민수는 90점으로 동점이므로 원래 순서 유지!
    sorted_students = sorted(students, key=lambda s: s[1])
    print("Stable Sort 결과 (동점자 원래 순서 유지):", sorted_students)

파이썬 소스 코드 핵심 포인트 해설

  1. counting_sort(): 값의 등장 횟수를 저장하는 카운팅 배열을 이용하여 $O(N+K)$ 타임에 완성하는 주석 해설입니다.
  2. sorted(): 파이썬의 표준 정렬 알고리즘인 Timsort는 대표적인 정렬 안정성(Stable Sort)을 보장합니다.

5. 알고리즘 설계 및 최적화 실무 지침 (Best Practices & Complexity Audit)

05. 정렬 알고리즘 3: 비비교 정렬 및 정렬 안정성 - 계수 정렬, 기수 정렬 및 Stable Sort 레슨에서 익힌 핵심 알고리즘 메커니즘을 코딩 테스트 및 대규모 웹/서버 엔지니어링 환경에 도입할 때 반드시 체크해야 하는 튜닝 가이드입니다.

1) 공간/시간 복잡도 한계 및 메모리 사용 제어

2) 예외 케이스(Edge Cases) 및 코딩 테스트 체크리스트

  1. 입력 경계값 검증: $N=1$ 이거나 $N=0$ 인 극단적 최소 입력, 혹은 모든 요소의 값이 동일한 경우(Corner Case)에 대한 예외 처리를 누락하지 않습니다.
  2. 무한 루프 및 사이클 감지: 그래프/트리 탐색 시 방문 처리 배열(visited[])의 업데이트 위치를 정확히 지정하여 중복 큐 삽입으로 인한 메모리 초과를 예방합니다.

6. 핵심 요약 및 실무 FAQ (Summary & Q&A)

Q1. 파이썬 코드 주석에서 강조된 성능 핵심은 무엇인가요?

Q2. 실무 개발에서 본 파이썬 알고리즘 패턴은 어디에 활용되나요?

← 이전04. 정렬 알고리즘 2: 고속 정렬 - 퀵 정렬(Quick Sort), 병합 정렬(Merge Sort) 및 힙 정렬(Heap Sort) 다음 →06. 이분 탐색(Binary Search)과 매개변수 탐색(Parametric Search) - Lower/Upper Bound