분할 정복 (Divide and Conquer) 기법을 사용하여 리스트를 두 부분으로 나누고, 각각을 재귀적으로 정렬한 뒤 병합하여 완성하는 정렬 알고리즘
function mergeSort(arr) {
if (arr.length <= 1) return arr;
const mid = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
return merge(left, right);
}
function merge(left, right) {
const result = [];
let i = 0, j = 0;
while (i < left.length && j < right.length) {
if (left[i] < right[j]) result.push(left[i++]);
else result.push(right[j++]);
}
return result.concat(left.slice(i)).concat(right.slice(j));
}
console.log(mergeSort([5, 3, 8, 4, 2])); // [2, 3, 4, 5, 8]
분할 정복 (Divide and Conquer) 기법을 사용하여 리스트를 특정 기준(Pivot)을 기준으로 두 부분으로 나누고 재귀적으로 정렬하는 알고리즘
function quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[Math.floor(arr.length / 2)];
const left = arr.filter(x => x < pivot);
const right = arr.filter(x => x > pivot);
const middle = arr.filter(x => x === pivot);
return [...quickSort(left), ...middle, ...quickSort(right)];
}
console.log(quickSort([5, 3, 8, 4, 2])); // [2, 3, 4, 5, 8]
정수나 정수로 표현 가능한 데이터를 정렬할 때 사용되는 알고리즘, 각 값의 발생 빈도를 계산하여 정렬
function countingSort(arr, maxValue) {
const count = new Array(maxValue + 1).fill(0);
const result = [];
arr.forEach(num => count[num]++);
count.forEach((frequency, num) => {
for (let i = 0; i < frequency; i++) {
result.push(num);
}
});
return result;
}
console.log(countingSort([5, 3, 8, 4, 2], 8)); // [2, 3, 4, 5, 8]