반응형
개념
- 배열의 값에서 Pivot(기준 값)을 선택 후, Pivot을 기준으로 집합을 분할하여 정렬하는 알고리즘(분할정복)
- 정렬이 된 값의 좌측 집합과 우측 집합은 값이 완전히 정렬이 된 상태.
- 데이터가 이미 정렬되어있는 경우, 분할정복 이점이 없고 삽입 정렬이 더 좋은 성능이 나올 수 있음.
private void quickSort(int[] list, int start, int end) {
/*
* start 시작 원소위치
* end 마지막 원소위치
*/
int pivot, i, j, temp;
if(start >= end) { // 배열의 원소가 1개인 경우 종료 - 재귀종료 조건
return;
}
pivot = start; //기준 값은 첫번째 원소로 설정
i = start+1; //기준 값보다 큰 값을 pivot 우측부터 배열 끝까지 탐색
j = end; //기준 값보다 작은 값을 배열 끝에서 좌측으로 탐색
//오른쪽->왼쪽(작은 값 탐색)으로 탐색한 위치가 왼쪽->오른쪽(큰 값 탐색)으로 탐색한 위치보다 작은 위치가 될 때까지 반복(엇갈릴때까지 반복)
while(i <= j) {
//1. 탐색수행 범위(왼쪽->오른쪽 큰값 탐색)
while(i <= end && list[i] <= list[pivot]) { //왼쪽은 pivot 값보다 큰 값 탐색
i++;
}
//2. 탐색수행 범위(오른쪽->왼쪽 작은값 탐색)
while (j > start && list[j] >= list[pivot]) { //오른쪽은 pivot 값보다 작은 값 탐색, 탐색값이 배열범위를 넘어가지않도록 시작위치로 탐색범위 제한
j--;
}
//3. 위치 변경(pivot보다 큰 값, 작은 값의 위치 검사(i, j))
if(i > j) { //현재 엇갈린 상태면, pivot 값과 j 값 교체(pivot값과 작은값 위치 서로 교체)
temp = list[j];
list[j] = list[pivot];
list[pivot] = temp;
} else { //엇갈린 상태가 아니라면, i와 j 값 교체(큰값과 작은값 위치 서로 교체)
temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
//탐색 위치가 엇갈려서 밖으로 나온 경우, 해당 pivot 값을 기준으로 좌측 집합과 우측 집합의 정렬 수행
//좌측 그룹
quickSort(list, start, j-1);
//우측 그룹
quickSort(list, j+1, end);
}
※ 평균 시간복잡도는 O(N*log N)
※ 최악 시간복잡도는 O(N^2)
반응형
'Algorithm > 기본' 카테고리의 다른 글
계수 정렬(counting sort) (0) | 2021.05.04 |
---|---|
병합 정렬(merge sort) (0) | 2021.04.29 |
삽입 정렬(insertion sort) (0) | 2021.04.26 |
버블 정렬(bubble sort) (0) | 2021.04.25 |
선택 정렬(selection sort) (0) | 2021.04.25 |