개요
인트로 정렬은 C++ STL에서 기본적으로 제공되는 정렬 함수입니다. 인트로 정렬은 퀵 정렬, 힙 정렬, 삽입 정렬로 이루어져 있습니다.
퀵 정렬은 평균의 경우에는 매우 빠른 알고리즘이지만, 최악의 경우에서는 느려지게 됩니다. 그 단점을 보완한 알고리즘이 인트로 정렬입니다.
작동 과정
인트로 정렬의 과정은 다음과 같습니다.
- 리스트의 크기가 16 이하라면 삽입 정렬을 한다.
- 전체 리스트에 대해 퀵 정렬을 수행한다.
- 수행 도중 재귀 호출의 깊이가 2⌈logn ⌉을 넘어가게 되면 4번 항목으로 넘어간다.
- 쪼개진 부분 리스트의 크기가 16 이하라면 그대로 놔둔다.
16보다 크다면 해당 부분 리스트에 대해 힙 정렬을 수행한다. - 3, 4번 항목이 모두 완료된 후, 대부분 정렬이 된 전체 리스트에 대해 삽입 정렬을 수행한다.
데이터가 적을 때에는 삽입 정렬이 퀵 정렬보다 더 빠르다는 것이 증명이 되어 있고, 16을 휴리스틱 하게 구해진 값입니다. 또한, 데이터가 “거의 다” 정렬이 된 경우에는 삽입 정렬이 가장 빠릅니다.
퀵 정렬을 2⌈log n⌉ 까지만 수행하기 때문에 최악의 경우에도 O(n^2)이 나오지 않게 됩니다.
코드는 퀵 정렬, 힙 정렬, 삽입 정렬을 이용해 짜면 됩니다.
구현
1 |
|
시간 복잡도는 최선의 경우에는 퀵 정렬의 최선의 시간 복잡도와 같고, 최악의 경우에는 힙 정렬의 최악의 시간 복잡도와 같습니다. 즉, 항상 O(n log n)입니다.