(http://stackoverflow.com/questions/164163/quicksort-choosing-the-pivot)
퀵 정렬에서의 피봇 선택에 따라서,
퀵 정렬의 실행 시간은 O(NlgN)에서 최대 O(N^2) 까지 걸릴 수 있다.
나쁜 (worst-case)의 경우의 예를 들면,
- 이미 정렬이 되어 있는 배열 (또는 거의 정렬된 배열)
- 반대로 정렬이 되어 있는 배열
을 정렬하고자 할 때, pivot을 가장 첫 번째 원소나 가장 마지막 원소로 지정하는 것이다.
이 경우, 각 단계마다 '원소 1개'와 '나머지 원소 전부' 로 쪼개지기 때문에,
divide-and-conquer 방식의 이점을 살리지 못하게 된다.
효율적인 Quick Sort를 위해서는, pivot을 잘 선택할 필요가 있다.
위 글에서 본 방법 중 일부는 다음과 같다.
1. Random Pivot : 말 그대로 랜덤.
2. median - of - three : 아래와 같은 과정으로 이루어진다.
1) random index 3개를 뽑는다.
2) 이 3개가 가리키는 원소들의 median 값으로 pivot을 설정한다.
이외에도 다양한 pivot 선택 전략이 있는데,
input으로 들어오는 배열의 성질에 따라서, 그 전략을 다르게 해야 할 것이다.
저 글의 링크에는 좀 더 다양한 토론이 있는데, 보는 것을 추천한다.
'알고리즘 대회 > 알고리즘' 카테고리의 다른 글
알고리즘 문제풀이 간단 시작 코드 (0) | 2013.07.03 |
---|---|
플로이드의 최단 거리 알고리즘 정리 - (하) (0) | 2013.05.08 |
플로이드의 최단 거리 알고리즘 정리 - (상) (0) | 2013.05.06 |