2021. 8. 4. 20:53ㆍ알고리즘(Algorithm)
실제 가장 빠른 정렬 알고리즘
전형적인 divide-and-conquer 알고리즘 중 하나
pivot보다 작은 값들을 리스트의 왼쪽으로, 큰 값들은 리스트의 오른쪽으로 재배열 한 후, 양 쪽을 재귀적으로 다시 정렬
퀵 정렬 코드(python)
퀵 정렬 구현 방법
초기상태
- 입력이 주어진 정렬해야 할 배열이다.
- 피벗은 arr[0], left와 right도 정의되어 있다.
1.
- left: 피벗 보다 큰 값이 나올 때까지 left++한다. 5>4이기 때문에 left는 더 이상 이동하지 않는다.
- right: 피벗보다 작은 값이 나올 떄까지 right --한다. 7>4이기 때문에 right--한다.
2.
- left: 이동이 없었다.
- right: 피벗보다 작은 3이 나오니 드디어 멈췄다.
3. left<=right이기 떄문에 arr[left]와 arr[right]를 swap한다.
4&5. left와 right가 조건에 맞게 이동을 하다가 멈추면 자리 swap
7.
- left와 right가 더 이상 이동할 수 없는 상황
- 노란부분: 피벗보다 모두 작은 부분
- 파란부분: 피벗보다 모두 큰 부분
8.
- 피벗의 위치와 left의 위치를 swap한다.
- 피벗보다 작은 부분(노란 부분) - 피벗 - 피벗보다 큰 부분(파란 부분) 순으로 정렬되는 모습을 볼 수 있다.
9. 이제 각 노란 부분, 파란 부분 각각 또 quick sort를 진행한다.
시간 복잡도
S | P | L |
p(pivot)을 기준으로 S는 P보다 작은 부분, L은 P보다 큰 부분
T(n) = T(|S|) + T(|L|) + c*n
#c*n번 비교를 통해 S P L을 분류
Worst Case - S 또는 L이 0인 경우. 이미 정렬된 것이 들어옴
T(n) = T(n-1) + c*n
=O(n^2)
Best Case - Average Case
T(n) = T(n/2) + T(n/2) + c*n = 2T(n/2) + c*n
=O(nlogn)
특징
장점
- 속도가 빠르다.
- 시간 복잡도가 O(nlog₂n)를 가지는 다른 정렬 알고리즘과 비교했을 때도 가장 빠르다.
- in-place로, 추가 메모리 공간을 필요로 하지 않는다.
- 퀵 정렬은 O(log n)만큼의 메모리를 필요로 한다.
단점
- 정렬된 리스트에 대해서는 퀵 정렬의 불균형 분할에 의해 오히려 수행시간이 더 많이 걸린다.
- 퀵 정렬의 불균형 분할을 방지하기 위하여 피벗을 선택할 때 더욱 리스트를 균등하게 분할할 수 있는 데이터를 선택한다.
EX) 리스트 내의 몇 개의 데이터 중에서 크기순으로 중간 값(medium)을 피벗으로 선택한다.
출처
https://gmlwjd9405.github.io/2018/05/10/algorithm-quick-sort.html
https://www.youtube.com/channel/UCJ4SXKMLQucqaxt4A6PonwQhttps://www.youtube.com/channel/UCJ4SXKMLQucqaxt4A6PonwQ
'알고리즘(Algorithm)' 카테고리의 다른 글
Binary Search_이진탐색 (0) | 2021.08.10 |
---|---|
Insertion Sort(삽입 정렬) (0) | 2021.08.05 |
Merge Sort(머지 소트) (0) | 2021.08.04 |
Sorting(정렬) (0) | 2021.08.02 |
알고리즘 정의와 분석 방법 (0) | 2021.05.24 |