퀵정렬은 idx값을 비교해서 왼쪽으로 작은값들을 몰아넣은 후 본인의 idx를 반환하는 헬퍼함수이로 기준이 되는 arr에 직접적으로 관여하기 때문에 idx값을 기준으로 움직인다.
이를 통해 재귀함수로 좌측이 더 작은 값들로만 위치되어있는지를 재귀적으로 쪼개서 순서대로 정렬할 수 있는 함수이며 nlogn의 시간복잡도를 가진다.
function pivot(arr, start = 0, end = arr.length - 1) { //계산해주는 피벗함수
const swap = (arr, idx1, idx2) => { //위치변경함수
[arr[idx1], arr[idx2]] = [arr[idx2], arr[idx1]];
};
let pivot = arr[start]; //시작지점부터 확인
let swapIdx = start; //시작지점 idx
for (let i = start + 1; i <= end; i++) {
if (pivot > arr[i]) {
swapIdx++; //스왑할경우 start값이 위치해야 할 포인트 +1
swap(arr, swapIdx, i); //시작값보다 작은경우 왼쪽으로 밀어버리기
}
}
swap(arr, start, swapIdx);//앞에 스왑된 idx들이 추가됨에 따라 시작점 idx와 스왑횟수위치와 교환
return swapIdx; //정렬기준점 및 정확한 위치(그것보다 작은값은 다 왼쪽으로 밀었으니)인 값의 idx 반환
}
function quickSort(arr, left = 0, right = arr.length -1){
if(left < right){
let pivotIndex = pivot(arr, left, right) // idx보다 작은점 왼쪽 큰것 오른쪽 정렬 후 기준점의 좌표
quickSort(arr,left,pivotIndex-1); //left ~ 기준점-1까지 재귀로 pivot
quickSort(arr,pivotIndex+1,right); //기준점+1 ~ right까지 재귀로 pivot
}
return arr; //정렬된 경우 리턴
}
'회고' 카테고리의 다른 글
번들링과 웹팩 (0) | 2022.07.25 |
---|---|
학습(알고리즘) (0) | 2022.07.24 |
HTML/CSS 심화-2 (0) | 2022.07.22 |
HTML/CSS 심화 (0) | 2022.07.21 |
프론트엔드 부트캠프(코드스테이츠) 3개월차 회고 (0) | 2022.07.20 |