평균적인 시나리오에서 시간복잡도가 낮기로 알려진 Quick Sort
를 자바스크립트로 구현해본다.
arr | result |
---|---|
[0, 5, 2, 1, 6, 3] | [0,1,2,3,5,6] |
[3, 6, 0, 2, 4, 1, 7, 5] | [0,1,2,3,4,5,6,7] |
분할
이라는 개념에 기반한다.피벗
으로 정하고, 피벗에서 작은 모든 수는 피벗의 왼쪽에, 큰 수는 피벗의 오른쪽에 둔다.포인터
를 두는데, 왼쪽 포인터는 배열의 0
번째 인덱스에서부터, 오른쪽 포인터는 피벗의 한 칸 앞
인덱스에서부터 시작한다.
class Sort {
constructor(arr) {
this.arr = arr;
}
partition (lPointer, rPointer){
let pivot = rPointer;
let pivotNum = this.arr[pivot];
rPointer--;
while (true) {
while (this.arr[lPointer] < pivotNum) {
lPointer++;
}
while (this.arr[rPointer] > pivotNum) {
rPointer--;
}
if (lPointer >= rPointer) break;
else this.swap(lPointer, rPointer);
}
this.swap(lPointer, pivot);
return lPointer;
}
swap (lPointer, rPointer) {
let tempValue = 0;
tempValue = this.arr[lPointer];
this.arr[lPointer] = this.arr[rPointer];
this.arr[rPointer] = tempValue;
}
quickSort (lIndex, rIndex) {
if(rIndex - lIndex <= 0) return;
const pivotPosition = this.partition(lIndex, rIndex);
this.quickSort(lIndex, pivotPosition-1);
this.quickSort(pivotPosition+1, rIndex);
return this.arr;
}
}
const arr1 = [0, 5, 2, 1, 6, 3];
const sortableArr = new Sort(arr1);
sortableArr.quickSort(0, arr1.length-1);
누구나 자료 구조와 알고리즘 - 제이 웬그로우