Published
- 2 min read
[ Algorithm ] Quick Sort(퀵 정렬)
Quick Sort
- 실무에서 가장 많이 사용하는 정렬
- 일반적 / 범용적으로 가장 빠름
- 진정한 분할 정복 알고리즘
- 모든 요소를 방문함(decrease - and-counquer와의 차이)
- 복잡도에 log가 있다는 것에서 알 수 있음
- 어떤 값(pivot)을 기준으로 목록을 하위 목록으로 2개로 나눔
- 목록을 나누는 기준은 pivot보다 작냐/크냐
- 이 과정을 재귀적으로 반복
- 재귀 단계가 깊어질 때마다 새로운 pivot 값을 뽑음
- pivot과 교환이 동일하지 않게 이동, 인덱스도 생각해야 해서 복잡하게 느껴질 수 있음
- 평균 수행 시간: O(NlogN)
- 최악 수행 시간: O(N^2)
- 메모리(공간 복잡도): O(logN)
- 안정성: X
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivotIndex = partition(arr, low, high);
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, high);
return i + 1;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}