퀵 정렬은 임의의 원소를 피벗으로 하여, 피벗과 비교하여 작은 값이 모인 집합과 큰 값이 모인 집합 두개로 나눕니다. 그 후 만들어진 두 집합 역시 동일한 과정을 거쳐 원소를 하나만 가질때까지 반복합니다.
퀵 정렬은 최악의 경우 O(N)의 시간 복잡도를 가지게 되는 데, 그럼에도 병합정렬이 아닌 퀵 정렬을 사용하는 이유는 평균 시간 복잡도는 O(nlogn)으로 병합 정렬보다 빠르기 때문입니다. 또한 추가적인 메모리를 필요로하지 않고, 입력 배열 자체를 정렬하는 제자리 정렬 알고리즘입니다.
각각의 함수에 대한 간단한 설명을 하겠습니다. 1. auto partition(typename vector<T>::iterator begin, typename vector<T>::iterator end)
해당 함수는 전달인자로 배열의 시작 주소와 마지막 주소를 받습니다. 그 후 첫 번째 주소에 저장된 원소를 피벗으로 두고, 피벗을 기준으로 작은 값은 왼쪽, 큰 값은 오른쪽에 배치하고 반환 값으로는 피벗보다 큰 원소의 주소를 반환합니다.
2. void quick_sort(typename vector<T>::iterator begin, typename vector<T>::iterator end)
해당 함수는 partition함수를 사용하여 얻은 원소를 기준으로 배열을 두개로 나누는 과정을 배열의 원소가 하나가 될 때까지 반복합니다.
이해를 돕기 위해 예시를 보겠습니다.
45
1
3
1
2
3
45
5
1
2
44
5
7
퀵 정렬은 임의의 원소값을 기준으로 나누지만 해당 코드에서는 첫 번째 원소를 기준으로 배열을 분리 했기에 그를 따르도록 하겠습니다.(피벗은 파랑색)
1
3
1
2
3
45
5
1
2
44
5
7
/
45
1
/
1
1
/
3
2
3
45
5
2
44
5
7
/
45
1
/
1
/
1
/
2
3
2
3
/
45
5
44
5
7
/
45
1
/
1
/
1
/
2
2
/
3
3
/
5
44
5
7
/
45
/
45
1
/
1
/
1
/
2
/
2
/
3
/
3
/
5
5
/
45
7
/
45
/
45
1
/
1
/
1
/
2
/
2
/
3
/
3
/
5
/
5
/
7
/
45
/
45
/
45
위에서 보듯 운이 좋지않다면, 단 하나의 값만을 정렬하는 좋지 못한 모습도 보인다.
이 경우(최악의 경우)에는 시간복잡도는 n2이 될 것입니다.