개발 공부/알고리즘
[정렬 알고리즘] #4. 퀵 정렬 (Quick Sort)
짹뚜
2022. 2. 17. 23:22
퀵 정렬
분할 정복 알고리즘 중 하나로 평균적으로 매우 빠른 속도를 가지고 있다. 퀵 정렬의 특징으로는 비 균등하게 분할을 한다.
알고리즘
퀵 정렬은 다음과 같이 진행된다.
- 입력된 배열을 pivot을 기준으로 비균등하게 2개의 배열로 나눈다. pivot을 중심으로 왼쪽에는 pivot보다 작은 요소, 오른쪽에는 pivot보다 큰 요소들로 나눈다.
- 분할된 배열들을 가지고 다시한번 새로운 pivot을 기준으로 비 균등하게 2개의 배열로 나눈다.
- 더 이상 분할이 안될때까지 반복적으로 진행한다.
// javascript 코드
const quickSort = (arr, left, right) => {
if (left >= right) return;
let low = left + 1;
let high = right;
let pivot = arr[left];
if (left < right) {
// 반복문을 돌면서 pivot보다 작은 요소들은 왼쪽에 큰 요소들은 오르쪽에 배치한다.
while (low <= high) {
while (arr[low] <= pivot && low <= right) {
low++;
}
while (arr[high] >= pivot && high > left) {
high--;
}
if (low < high) {
const temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
} else {
// low 와 high가 엇갈리면 pivot값과 high를 바꾼다.
// 그리고 반복문이 종료된다.
const temp = arr[high];
arr[high] = arr[left];
arr[left] = temp;
}
}
quickSort(arr, left, high - 1);
quickSort(arr, low, right);
}
}
}
특징
- 속도가 빠르다. 평균적으로 시간 복잡도 O(nlog₂n)을 가지고 있다.
- 그러나 이미 정렬된 배열에 대해서는 O(n²) 의 시간 복잡도를 가진다.
- O(log n) 만큼의 메모리만 필요하다.
pivot
주로 배열의 맨 왼쪽 또는 오른쪽 요소를 pivot으로 선택하지만 배열의 중간 요소를 고르기도 한다. 또는 매번 랜덤 한 요소를 pivot으로 선택하기도 한다. 주로 배열의 왼쪽, 오른쪽, 가운데 요소 중에 크기가 중간이 값을 pivot으로 선택하는 경우가 많다.