퀵 정렬의 핵심은 피벗 값의 설정이다.
피벗을 어떻게 선택하냐에 따라서 알고리즘의 성능이 큰 편차를 보인다.
하지만, 정렬되지 않은 리스트에서 중위값을 선택해야하는 문제에 봉착하게 된다.
좋은 피벗 값을 찾기 위한 방법은 여러 가지가 있지만 몇 가지만 살펴보면,
등의 방법이 있다.
const quickSort = (list) => {
let lte = []; // 피벗보다 작은 원소들을 담을 배열
let gte = []; // 피벗보다 큰 원소들을 담을 배열
let pivot = list[0]; // 배열의 첫 번째 원소를 피벗으로 하기로 하자
/*
루프를 돌면서 피벗보다 작은 원소는 lte에, 피벗보다 큰 원소는 gte에 담은 다음,
[ lte ] - [ pivot ] - [ gte ] 이렇게 배열을 이어붙히는 과정을 재귀호출
*/
}
class Quicksort {
constructor(_list) {
const list = _list;
const quicksort = list => {
if (Array.isArray(list)) {
if (list.length === 0) {
return [];
}
const lt = [];
const gt = [];
const pivot = list[0];
for (let i = 0; i < list.length; i++) {
if (list[i] < pivot) {
lt.push(list[i]);
} else if (list[i] > pivot) {
gt.push(list[i]);
}
}
return quicksort(lt).concat(pivot, quicksort(gt));
}
};
return quicksort(list);
}
}
//-----------------------------------------------------
const data = [18, 15, 23, 28, 52, 59, 13];
const sortedData = new Quicksort(data);
console.log(sortedData); // [ 13, 15, 18, 23, 28, 52, 59 ]