배열 의 한 요소를 선택해서 적절한 위치에 배치시키는 것을 반복하는 정렬 방법 입니다.
랜덤으로 고르게 되는 요소를 피벗(Pivot)이라고 부릅니다.
피벗이 정렬된 위치에 자리잡으면, 퀵정렬을 피벗을 양쪽 사이드에 실행하는 것을 반복합니다.
퀵 정렬을 수행하기 위해서 피벗을 기준으로 배열을 재배치하는 함수를 만들어야 합니다.
퀵 정렬의 실행시간은 피벗의 선택 방법에 따라 달라질 수 있습니다. 이상적으로는 데이터 집합의 중간값이 되도록 선택해야 합니다.
이 글에서 퀵 정렬을 및 Pivot helper 함수를 구현하기 위해서 편의상 첫 번째 요소를 피벗으로 선택하겠습니다.
function pivot(arr, start=0, end=arr.length-1){
function swap(array, i, j) {
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
var pivot = arr[start];
var swapIdx = start;
for(var i = start + 1; i < arr.length; i++){
if(pivot > arr[i]){
swapIdx++;
swap(arr,swapIdx,i);
}
}
swap(arr,start,swapIdx);
return swapIdx;
}
function quickSort(arr, left = 0, right = arr.length -1){
if(left < right){
let pivotIndex = pivot(arr, left)
// 피벗의 왼쪽
quickSort(arr,left,pivotIndex-1);
// 피벗의 오른쪽
quickSort(arr,pivotIndex+1);
}
return arr;
}
O(n log n) - 최고
O(n log n) - 평균
O(n2) - 최악