안정한 정렬 방법
레코드의 수가 적을 경우 알고리즘 자체가 매우 간단하므로 다른 복잡한 정렬 방법보다 유리할 수 있다.
대부분위 레코드가 이미 정렬되어 있는 경우에 매우 효율적일 수 있다.
비교적 많은 레코드들의 이동을 포함한다.
레코드 수가 많고 레코드 크기가 클 경우에 적합하지 않다.
https://gmlwjd9405.github.io/2018/05/06/algorithm-insertion-sort.html
const insertionSort = function (arr) {
function repeat(idx) {
if (idx > arr.length - 1) {
return;
}
for (let i = 0; i < idx; i++) {
if (arr[i] > arr[idx]) {
let [frt, cur] = [arr[i], arr[idx]];
arr[i] = cur;
arr[idx] = frt;
}
}
repeat(idx + 1);
}
repeat(1);
return arr;
};
let output = insertionSort([5, 4, 3, 2, 1]);
console.log(output); // --> [1,2,3,4,5]
큰 숫자를 왼쪽부터 차고, 작은 숫자를 오른쪽부터 찾는다.
const quickSort = function (arr) { function quick(arr, start, end) { if (start >= end) { return; } let key = start; let i = start + 1; let j = end; while (i <= j) { while (arr[i] <= arr[key]) { i++; } while (arr[j] >= arr[key] && j > start) { j--; } if (i > j) { let [frt, back] = [arr[key], arr[j]]; arr[key] = back; arr[j] = frt; } else { let [frt, back] = [arr[i], arr[j]]; arr[i] = back; arr[j] = frt; } } quick(arr, start, j - 1); quick(arr, j + 1, end); } quick(arr, 0, arr.length - 1); return arr; };
재귀함수 사용
const quickSort = function (arr) { if (arr.length <= 1) return arr; const pivot = arr[0]; const left = []; const right = []; for (let i = 1; i < arr.length; i++) { if (arr[i] <= pivot) left.push(arr[i]); else right.push(arr[i]); } const lSorted = quickSort(left); const rSorted = quickSort(right); return [...lSorted, pivot, ...rSorted]; };
참고
알고리즘 정리 블로그