하루에 한 문제
퀵 정렬(Quick Sort) 본문
퀵 정렬
- 퀵 정렬은 불안정 정렬에 속한다.
- 분할 정복 알고리즘의 하나로, 평균적으로 매우 빠른 수행속도를 자랑하는 정렬
- 분할 정복이란 문제를 작은 2개의 문제로 분리하고 각각을 해결한 다음, 결과를 모아서 원래의 문제를 해결하는 전략이다.
- 과정
- 리스트 안의 한 요소를 선택한다. 이를 피벗(pivot) 이라고 한다.
- 피벗을 기준으로 피벗보다 작은 요소들은 모두 피벗의 왼쪽으로 가고 피벗보다 큰 요소들은 모두 피봇기준 오른쪽으로 옮겨진다.
- 피벗을 제외한 왼쪽 리스트와 오른쪽 리스트를 다시 정렬한다.
- 분할된 부분 리스트에 대하여 재귀호출을 이용해 정렬을 반복
- 부분 리스트에서도 다시 피벗을 정하고 피벗을 기준으로 좌, 우를 나눈다.
- 부분 리스트들이 더 이상 분할이 불가능할 때까지 반복
퀵 정렬의 장점
- 속도가 빠르다 - O(nlogn)를 가지는 다른 정렬 알고리즘과 비교했을 때도 가장 빠르다.
- 추가 메모리 공간을 필요로 하지 않는다.
퀵 정렬의 단점
- 정렬된 리스트에 대해서는 불균형 분할이 되기 때문에 오히려 수행시간이 더 많이 걸린다.
퀵 정렬의 최악을 면하기 위한 방법
1. 배열의 랜덤화
2. 랜덤 피벗 선택
3. 3개의 원소를 피벗 후보로 두고 그 중간 값을 선택
참고
'CS > 자료구조' 카테고리의 다른 글
트라이(Trie) (2) | 2021.04.10 |
---|---|
Java Collections Framework(JCF) (1) | 2021.03.17 |
카운팅 정렬(Counting sort) (0) | 2021.03.17 |
버블 정렬(bubble sort) (0) | 2021.03.16 |
삽입정렬(Insertion sort) (1) | 2021.03.16 |
Comments