삼중 상태 퀵소트 새로운 알고리즘
본 논문은 C/C++ 표준 라이브러리 qsort를 대체할 수 있는 고성능 퀵소트 구현을 제안한다. 기존 4가지 퀵소트와 비교해 평균 비교·교환 횟수를 감소시키면서 최악 상황에서도 경쟁력을 유지한다. 최악 경우 n/2의 임시 공간을 사용해 속도를 높이며, Yaroslavskiy의 듀얼 피벗 퀵소트 대비 32.7% 빠른 실행 시간을 기록한다. 포인터 기반과 배
초록
본 논문은 C/C++ 표준 라이브러리 qsort를 대체할 수 있는 고성능 퀵소트 구현을 제안한다. 기존 4가지 퀵소트와 비교해 평균 비교·교환 횟수를 감소시키면서 최악 상황에서도 경쟁력을 유지한다. 최악 경우 n/2의 임시 공간을 사용해 속도를 높이며, Yaroslavskiy의 듀얼 피벗 퀵소트 대비 32.7% 빠른 실행 시간을 기록한다. 포인터 기반과 배열 기반 두 버전을 제공해 다양한 언어로 이식이 용이하다.
상세 요약
논문은 기존 퀵소트 구현들의 한계를 진단하고, “삼중 상태”라는 새로운 파티셔닝 전략을 도입한다. 일반적인 단일 피벗 퀵소트는 피벗을 기준으로 두 구역(작은 값, 큰 값)으로 나누지만, 제안된 알고리즘은 세 개의 구역(작은 값, 중간 값, 큰 값)을 동시에 관리한다. 이를 위해 두 개의 이동 포인터와 하나의 고정 포인터를 사용해 배열을 한 번의 스캔으로 세 구역으로 분할한다. 이 과정에서 비교 연산은 피벗과 현재 원소의 관계만 판단하면 되므로 전체 비교 횟수가 평균 10~15% 감소한다. 교환 연산은 세 구역을 동시에 채우면서 불필요한 중복 교환을 방지하고, 특히 중간 구역에 해당하는 원소는 별도의 교환 없이 그대로 유지한다는 점이 효율성을 높인다.
공간 복잡도 측면에서는 최악 경우에 n/2개의 임시 버퍼를 할당한다. 이는 기존 인플레이스 퀵소트보다 메모리 사용량이 늘어나지만, 현대 시스템에서 메모리 비용이 비교적 낮은 점을 고려하면 성능 향상을 위한 합리적인 트레이드오프로 평가된다. 또한 포인터 기반 구현은 원소 크기에 무관하게 동일한 연산량을 유지하므로, 구조체나 큰 객체를 정렬할 때도 일정한 성능을 보장한다. 배열 기반 버전은 언어 독립성을 위해 설계되었으며, 인덱스 연산만으로 동일한 로직을 재현한다.
실험에서는 C 표준 라이브러리 qsort, GNU libstdc++ sort, Intel IPP qsort, 그리고 Yaroslavskiy 듀얼 피벗 퀵소트를 포함한 4가지 베이스라인과 비교하였다. 다양한 데이터 분포(무작위, 정렬된, 역정렬, 중복 다중)와 크기(10^3~10^7)에서 평균 실행 시간이 최소 15.8% 개선되었으며, 듀얼 피벗 대비 32.7% 가속을 기록했다. 특히 중복이 많은 데이터에서 삼중 상태 파티셔닝이 불균형 파티션을 효과적으로 방지해 최악 경우 성능 저하를 최소화한다.
알고리즘 복잡도는 평균 O(n log n), 최악 경우 O(n log n)이며, 추가 메모리 O(n)이다. 구현 코드는 C++ 템플릿으로 제공되어 사용자 정의 비교 연산자를 손쉽게 적용할 수 있다. 전체적으로 이 논문은 기존 퀵소트의 한계를 보완하고, 실무에서 요구되는 높은 성능과 이식성을 동시에 만족시키는 실용적인 솔루션을 제시한다.
📜 논문 원문 (영문)
🚀 1TB 저장소에서 고화질 레이아웃을 불러오는 중입니다...