본문 바로가기
Language/Java

[JAVA] Collections.sort()의 내부 알고리즘 : TimSort의 혁신과 작동 원리

by Papa Martino V 2026. 1. 18.
728x90

Collections.sort()의 내부 알고리즘
Collections.sort()의 내부 알고리즘

 

자바 프로그래밍을 하면서 리스트를 정렬할 때 우리는 습관적으로 Collections.sort()를 호출합니다. 하지만 이 메서드 뒤에 숨겨진 정렬 알고리즘이 현대 컴퓨팅 환경에 최적화된 공학적 결정의 집약체라는 사실을 아는 개발자는 많지 않습니다. 오늘은 단순히 '정렬된다'는 결과 너머, 자바가 선택한 TimSort 알고리즘의 본질을 파헤쳐 봅니다.


1. 왜 Quick Sort가 아닌 TimSort인가?

전통적인 전산학 강의에서는 가장 빠른 정렬 알고리즘으로 Quick Sort를 배웁니다. 하지만 자바의 Collections.sort()(정확히는 List.sort())는 Quick Sort가 아닌 TimSort를 채택하고 있습니다. 그 이유는 '안정성(Stability)'과 '데이터의 현실적 특성' 때문입니다.

  • 안정 정렬(Stable Sort): 정렬되지 않은 상태에서 같은 값을 가진 요소들의 상대적 순서가 정렬 후에도 유지되어야 합니다. 객체 데이터를 다루는 자바 리스트 특성상 매우 중요한 요소입니다.
  • 현실의 데이터: 완전히 무작위인 데이터보다, 이미 일부분 정렬되어 있는(Partially sorted) 데이터가 현실에는 훨씬 많습니다.

2. TimSort의 핵심 아키텍처

TimSort는 2002년 Tim Peters에 의해 Python용으로 개발되었으며, 자바 7부터 표준 정렬 알고리즘으로 도입되었습니다. 이 알고리즘은 Merge SortInsertion Sort의 장점만을 결합한 '하이브리드 정렬'입니다.

2.1. 승리 전략: Run과 Minrun

TimSort는 전체 데이터를 한꺼번에 정렬하지 않습니다. 대신 데이터를 'Run'이라고 불리는 작은 단위의 정렬된 조각으로 분할합니다. 데이터가 이미 오름차순이나 내림차순으로 정렬되어 있다면 이를 하나의 Run으로 간주합니다.

2.2. 최적화의 기술: 이진 삽입 정렬(Binary Insertion Sort)

데이터 조각이 너무 작으면(Minrun보다 작으면), TimSort는 Binary Insertion Sort를 사용하여 해당 조각을 정렬합니다. 작은 배열에서는 Quick Sort나 Merge Sort의 재귀 호출 비용보다 삽입 정렬의 단순함이 더 효율적이기 때문입니다.


3. 알고리즘 성능 분석 및 비교

TimSort가 가진 압도적인 성능 지표를 다른 주요 정렬 알고리즘과 비교해 보겠습니다.

알고리즘 최선(Best) 시간 복잡도 평균(Average) 시간 복잡도 최악(Worst) 시간 복잡도 안정성 여부
TimSort O(n) O(n log n) O(n log n) Stable
Quick Sort O(n log n) O(n log n) O(n²) Unstable
Merge Sort O(n log n) O(n log n) O(n log n) Stable
Insertion Sort O(n) O(n²) O(n²) Stable

위 표에서 알 수 있듯이, TimSort는 이미 정렬된 데이터에 대해 O(n)이라는 경이로운 성능을 보여주며, 최악의 경우에도 O(n log n)을 보장합니다.


4. 자바 개발자가 알아야 할 실전 포인트

4.1. 원시 타입(Primitive) vs 객체 타입(Object)

자바는 정렬을 수행할 때 데이터 타입에 따라 다른 전략을 취합니다.

  • Collections.sort() & Arrays.sort(Object[]): 객체 정렬 시에는 TimSort를 사용합니다. (안정성 보장 필요)
  • Arrays.sort(int[]): 원시 타입 정렬 시에는 Dual-Pivot Quicksort를 사용합니다. 원시 타입은 값이 같으면 순서가 바뀌어도 상관없으므로 속도가 더 빠른 퀵 정렬 계열을 선택한 것입니다.

4.2. 성능 최적화 팁

TimSort는 데이터가 이미 어느 정도 정렬되어 있을 때 가장 강력합니다. 대량의 데이터를 다룰 때, 데이터의 정렬 상태를 미리 파악할 수 있다면 불필요한 연산을 줄이는 힌트가 될 수 있습니다.


5. 결론

자바의 Collections.sort()는 단순한 함수가 아닙니다. 컴퓨터 과학의 고전적인 알고리즘들을 현대적인 관점에서 재해석하여, 현실 세계의 데이터 특징을 가장 잘 반영하도록 설계된 TimSort의 구현체입니다. 성능과 안정성이라는 두 마리 토끼를 잡기 위한 자바의 정교한 설계를 이해함으로써, 우리는 더 효율적인 코드를 작성할 수 있는 깊은 통찰력을 얻게 됩니다.


참고 문헌 (Sources)

  • Oracle Java Documentation: java.util.Collections.sort(List<T> list)
  • Python Software Foundation: "TimSort - Introduction to the design" (by Tim Peters)
  • OpenJDK Source Code: java.util.TimSort.java implementation details
  • "Introduction to Algorithms" (CLRS) - Sorting and Order Statistics section
728x90