"퀵 정렬"
: 특정한 값을 기준으로 큰 숫자와 작은 숫자를 서로 교환한 뒤에 배열을 반으로 나누는 정렬 방법
- 시간 복잡도 : O(N * logN)
- 최악의 시간 복잡도 : O(N^2)
- 대표적인 '분할 정복' 방법을 채택한 알고리즘
- 재귀함수로 구현
- "피벗(Pivot)" : 기준 값
- 보통 맨 앞 요소를 피벗으로 설정
class Sort {
public void Quick_Sort(int[] arr, int start, int end) {
if(start >= end) // 원소가 한 개인 경우, 그대로 두기
return;
int pivot = start; // 피벗은 첫 번째 원소
int i = start + 1;
int j = end;
while(i <= j) { // 엇갈릴 때까지 반복
while(i <= end && arr[i] <= arr[pivot]) // 피벗보다 큰 값을 만날 때
i++;
while(j > start && arr[j] >= arr[pivot]) // 피벗보다 작은 값을 만날 때
j--;
if(i > j) { // 현재 엇갈린 상태이면, 피벗과 교체
int temp = arr[j];
arr[j] = arr[pivot];
arr[pivot] = temp;
}
else { // 엇갈리지 않은 상태이면, i와 j를 교체
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
Quick_Sort(arr, start, j - 1);
Quick_Sort(arr, j + 1, end);
}
}
※ 내림차순 버전
class Sort {
public void Quick_Sort(int[] arr, int start, int end) {
if(start >= end)
return;
int pivot = start;
int i = start + 1;
int j = end;
while(i <= j) {
while(i <= end && arr[i] >= arr[pivot]) // arr[i] >= arr[pivot]으로 수정
i++;
while(j > start && arr[j] <= arr[pivot]) // arr[j] <= arr[pivot]으로 수정
j--;
if(i > j) {
int temp = arr[j];
arr[j] = arr[pivot];
arr[pivot] = temp;
}
else {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
Quick_Sort(arr, start, j - 1);
Quick_Sort(arr, j + 1, end);
}
}
'onYouTube > Algorithm' 카테고리의 다른 글
병합 정렬(Merge Sort) (0) | 2021.04.02 |
---|---|
기초 정렬 알고리즘 문제 풀이 (0) | 2021.04.02 |
삽입 정렬(Insertion Sort) (0) | 2021.04.02 |
버블 정렬(Bubble Sort) (0) | 2021.04.02 |
선택 정렬(Selection Sort) (0) | 2021.04.02 |