간단하게 요약하자면
피폿을 기준으로 왼쪽에는 작은수를 오른쪽에는 큰 수를 배치하면서 정렬하는 알고리즘
"왼-작은수/오-큰수를 배치하려면 어떻게 해야할까요?"
방법
1. 피봇의 왼쪽 끝에서는 피봇보다 큰수를, 오른쪽 끝에서는 찾아서 스왑해주면 됩니다.
2. 왼쪽/오른쪽 찾는 위치가 반대가 될 경우 = 왼-작은수/오-큰수 배치가 이미 되었다는 의미
3. 피봇과 오른쪽 찾는 위치와 스왑해 줍니다.
4. 피봇은 알맞은 위치를 찾았지만 왼쪽/오른쪽 구역은 정렬이 되지 않았습니다. 해당 구역들을 1-3번 방법으로 반복해줍니다.
''일반 정렬 방법들보다 얼마나 빠를까요?'
장점
보통 O(n^2) 시간복잡도를 가지는 선택/삽입 정렬에 비해 평균적으로 빠릅니다.
O(nlog2n) 의 시간복잡도를 가지고 있습니다.
우선 정렬 범위가 반씩 줄어들기 때문에 log2n 정도 걸립니다.
그 안에서<N 반복하며 스왑해주기 때문에 O(nlog2n)정도의 시간이 걸립니다.
단점
이미 역/정렬되어있을 경우 (= 최악의 경우) O(n^2)의 시간이 걸린다는 단점이 있습니다.
절반씩 정렬 범위를 줄여야 하는데 정렬이 되어 있다면 피봇은 항상 맨 끝에 위치하게 되고 피봇을 중심으로 구간이 절반씩 나누어 지지 않습니다. 결국 n * (n-1) .. 반복하게 되어 O(n^2)이 됩니다.
활용
이러한 단점이 있지만 STL의 Algorithm - sort 함수가 퀵소트 방식을 사용한다고 합니다.
'Programming' 카테고리의 다른 글
[도서] Code Complete - #1 (0) | 2020.05.06 |
---|---|
프로세스와 쓰레드 (0) | 2020.05.04 |
해쉬 테이블 (0) | 2020.04.24 |
Git 기본 커맨드 정리 (0) | 2020.04.14 |
Shader (0) | 2020.04.10 |