반응형
✅ 퀵 정렬 (Quick Sort)
❕ 기본 개념
- 분할 정복(divide and conquer) 방법을 통해 정렬
- 수열 안에서 기준이 되는 수인 피봇(pivot)을 임의로 하나 선택한 후, 나머지 수를 '피봇보다 작은 수'와 '피봇보다 큰 수'의 두 그룹으로 나눈다. 피봇을 기준으로 왼쪽과 오른쪽의 리스트들을 각각 정렬하면 전체 정렬이 완료됨
- 분할된 두 개의 리스트에 대해 재귀적으로 앞의 과정을 반복한다. (재귀는 리스트의 크기가 0 또는 1이 될 때까지 반복)
- n의 리스트를 정렬하는데 걸리는 시간을 T(n), c는 임의의 상수라 하고, 리스트가 피봇 기준으로 두개의 비슷한 크기의 부분집합으로 나뉜다는 가정 하에 얻는 평균 시간복잡도는 O(n logn)이다.
- 반면, 운이 나빠 매번 최솟값이 피봇으로 선택되면 모든 숫자가 피봇의 오른쪽으로 가기 때문에 n층의 재귀가 발생하게 됨. 따라서 최악의 경우의 시간복잡도는 O(n2)
❕ 작동 방식
✔ 구현 방법 (JS)
function partition(arr, start, end) {
// Taking the last element as the pivot
const pivotValue = arr[end];
let pivotIndex = start;
for (let i = start; i < end; i++) {
if (arr[i] < pivotValue) {
// Swapping elements
[arr[i], arr[pivotIndex]] = [arr[pivotIndex], arr[i]];
// Moving to next element
pivotIndex++;
}
}
// Putting the pivot value in the middle
[arr[pivotIndex], arr[end]] = [arr[end], arr[pivotIndex]];
return pivotIndex;
}
function quickSortRecursive(arr, start, end) {
// Base case or terminating case
if (start >= end) {
return;
}
// Returns pivotIndex
let index = partition(arr, start, end);
// Recursively apply the same logic to the left and right subarrays
quickSort(arr, start, index - 1);
quickSort(arr, index + 1, end);
}
array = [7, -2, 4, 1, 6, 5, 0, -4, 2];
quickSortRecursive(array, 0, array.length - 1);
console.log(array);
// ouput
// -4,-2,0,1,2,4,5,6,7
참고자료
「알고리즘 도감」 中 2-7 퀵 정렬
Algorithms iOS app - Quick Sort Simulation
https://ko.wikipedia.org/wiki/%ED%80%B5_%EC%A0%95%EB%A0%AC
https://njkhanh.com/quicksort-swift-p5f35363935
https://stackabuse.com/quicksort-in-javascript/
반응형
'Devlog > DS & Algorithms' 카테고리의 다른 글
[알고리즘] Dynamic Programming (0) | 2022.08.06 |
---|---|
[알고리즘] 계수 정렬 (0) | 2022.08.06 |
[알고리즘] 삽입 정렬 (0) | 2022.08.05 |
[알고리즘] 선택 정렬 (0) | 2022.08.05 |
[알고리즘] BFS & DFS (0) | 2022.07.30 |