퀵 정렬: 분할 정복(Divide and Conquer)에 기반한 알고리즘
1. 데이터 집합 내에서 임의의 기준 요소 선택. 기준요소보다 작은 요소는 왼쪽에, 큰 요소는 오른쪽에 위치시킨다.
2. 나누어진 각각의 집합에서 기준요소를 정한 후 1번을 반복한다.
3. 더이상 데이터 집합을 나눌 수 없을 때까지 반복한다.
*좋은 기준요소를 선택하는 것이 성능에 도움이 된다. 보통 중간값으로 기준요소로 선택함.
고려해야할 점
-배열을 데이터 집합의 자료구조로 사용할 때, 분할은 어떻게 수행해야 하는가?(배열은 삽입/삭제가 자유롭지 않다)
-반복되는 분할 과정을 어떻게 처리할 것인가?
-> '수색 섬멸' 작전 이용. 2명을 투입해서 한 명은 왼쪽->오른쪽으로 이동하면서 기준요소보다 큰 요소를 찾고 , 다른 한명은 오른쪽->왼쪽으로 이동하면서 기준요소보다 작은 요소를 찾는다.
이후 두 정찰병이 찾아낸 두 요소를 교환한다.
-Partition() 함수: 정렬 대상의 첫번째 요소를 기준요소(pivot)로 지정하고, while 루프를 통해 분할 수행.
두 개의 루프는 두 정찰병의 위치를 옮긴다.
첫번째 루프는 DataSet의 왼쪽에서 출발해서 pivot보다 큰 요소를 찾을 때까지 탐색을 계속하면서 Left를 1씩 증가 시킨다. 그러다가 pivot보다 큰 요소를 찾으면 Left에 그 요소가 위치한 인덱스를 저장하고 종료한다.
다른 루프는 DataSeet의 오른쪽에서 출발해서 pivot보다 작은 요소를 찾아 그 요소의 위치를 Right에 저장한다.
Left와 Right를 비교한 후(22행), Left가 Right보다 작으면 바꾼다. 두 개가 같다면 두 정찰병이 서로 만났다는 뜻이니 루프 종료.
분할 작업 종료 후 기준 요소와 분할 왼쪽 데이터 집합의 오른쪽 끝에 있는 요소 교환하고 기준 요소의 새 위치 반환.
-최선의 경우(분할이 이등분씩 되는 경우): 퀵 정렬의 재귀 호출 깊이는 log2n.
비교 횟수: n , 퀵 정렬의 비교 횟수: nlog2n
-최악의 경우(1,(n-1)씩 분할 되는 경우): 퀵 정렬의 재귀 호출 깊이는 n(n-1)/2
-평균의 경우: 1.39nlog2n
'알고리즘 &자료구조' 카테고리의 다른 글
[알고리즘] 5. 순차탐색 (0) | 2021.10.23 |
---|---|
[알고리즘] 4. c표준 라이브러리의 퀵 정렬 함수 (0) | 2021.10.21 |
[알고리즘] 2. 삽입정렬(Insertion Sort) (0) | 2021.10.21 |
[알고리즘] 1. 버블정렬(Bubble Sort) (0) | 2021.10.20 |
[자료구조] 11. 분리집합 (0) | 2021.10.20 |