Tim Sort는 Merge Sort와 Insertion Sort의 장점을 결합하여 만들어진 하이브리드 정렬 알고리즘입니다.
Python, Java 등 여러 프로그래밍 언어에서 기본 정렬로 사용되고 있습니다.
| 요소 | 설명 |
|---|---|
| Run | 배열에서 증가하거나 감소하는 부분 배열(덩어리) |
| Binary Insertion Sort | 작은 Run들을 빠르게 정렬 |
| Merge Sort | 정렬된 Run들을 병합 |
| Stack 구조 | Run들을 메모리 효율적으로 병합하기 위해 사용 |
| Galloping Mode | 병합 시 두 Run 중 한 쪽이 계속 이기면 빠르게 Merge |
| Locality of Reference | CPU 캐시 친화적으로 동작 (Insertion Sort 사용) |
자연스러운 Run을 찾는 과정
예시:
배열: [1, 2, 3, 7, 6, 4, 5, 8]
Run: [1,2,3,7], [6,4] (→ 역순 정렬 후 [4,6]), [5,8]
MIN_RUN보다 작으면, Binary Insertion Sort를 사용해 정렬합니다.O(n log n) vs O(n²))X > Y + Z, Y > Z, 등 특정 조건을 만족하지 않으면 merge 수행→ Stack을 이용해 Run들을 관리하므로 병합 시 필요한 임시 버퍼 최소화
예: Left = [1,2,3,4,5], Right = [100,101,...]
병합 시 Left가 계속 이기므로 Galloping으로 Left 전부 복사예시:
Tim Sort는 작은 Run에 Insertion Sort를 적용 → Locality를 극대화
→ Merge Sort는 캐시 효율이 낮음 (임시 버퍼를 자주 씀)
| 항목 | Merge Sort | Tim Sort |
|---|---|---|
| 임시 버퍼 사용 | O(n) | O(n) (하지만 Stack 병합으로 덜 사용함) |
| 정렬된 부분 활용 | ❌ 없음 | ✅ Run 기반 정렬 |
| 작은 Run 정렬 | ❌ 전역 병합 | ✅ Insertion Sort (캐시 친화적) |
| 메모리 접근 | 무작위 | ✅ Locality 우수 |
| 메모리 사용 | 많음 | ✅ 적음 (Stack, Run 병합 제한) |
| 단계 | 시간복잡도 |
|---|---|
| Run 탐색 | O(n) |
| Run 정렬 (Binary Insertion Sort) | O(n log k) |
| 병합 (Merge Sort + Galloping) | O(n log n) |
| 최선 (거의 정렬됨) | O(n) |
| 평균/최악 | O(n log n) |
| 공간 복잡도 | O(n) (하지만 Merge Sort보다 효율적) |
| 특징 | 설명 |
|---|---|
| 병합 기반 | Merge Sort처럼 안정 정렬 |
| 캐시 친화적 | 작은 Run을 Insertion Sort로 정렬 (Locality 효과 극대화) |
| 공간 효율 | Stack으로 병합 관리, Merge Sort보다 메모리 효율 좋음 |
| Galloping | 병합 가속 기능 |
| 증가/감소 Run 자동 탐색 | 실제 데이터 패턴 활용 (현실적 최적화) |
Reference