여러 정렬 알고리즘을 배움으로서, 어떻게 효율적인 알고리즘을 적용할지 그리고 왜 상황마다 알고리즘을 다르게 써야하는 지 개념을 잡을 수 있습니다.
https://visualgo.net/en
참고하기 좋은 사이트, 시각화 자료가 많습니다.
선택 정렬은 정렬되지 않은 목록에서 최소 요소를 반복적으로 찾아 목록의 시작 부분으로 이동하는 간단한 정렬 알고리즘입니다. 알고리즘은 처음에 비어 있는 정렬된 하위 목록과 나머지 모든 요소를 포함하는 정렬되지 않은 하위 목록의 두 하위 목록을 유지합니다.
장점:
단점:
function selectionSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
let minIndex = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex !== i) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
}
return arr;
}
// Example usage:
let arr = [5, 3, 8, 4, 2];
console.log(selectionSort(arr)); // [2, 3, 4, 5, 8]
버블 정렬은 인접한 요소의 순서가 잘못된 경우 반복적으로 교체하는 간단한 정렬 알고리즘입니다.
장점:
단점:
function bubbleSort(arr) {
let len = arr.length;
for (let i = 0; i < len; i++) {
for (let j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
// Example usage:
let arr = [5, 3, 8, 4, 2];
console.log(bubbleSort(arr)); // [2, 3, 4, 5, 8]
삽입 정렬은 전체 배열이 정렬될 때까지 한 번에 한 요소씩 배열의 정렬된 부분을 반복적으로 구축하여 작동하는 간단한 정렬 알고리즘입니다. 배열을 반복하고 각 요소를 배열의 정렬된 부분에서 올바른 정렬된 위치에 삽입하여 이를 수행합니다.
삽입 정렬은 작은 데이터셋이나 부분적으로 정렬된 데이터셋에는 간단하고 효율적이지만
최악의 경우 시간 복잡도는 O(n^2)이므로 큰 데이터셋에는 비효율적입니다.
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
let j = i;
while (j > 0 && arr[j] < arr[j - 1]) {
[arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
j--;
}
}
return arr;
}
// Example usage:
let arr = [5, 3, 8, 4, 2];
console.log(insertionSort(arr)); // [2, 3, 4, 5, 8]
입력 배열을 더 작은 하위 배열로 나누고 이러한 하위 배열을 재귀적으로 정렬한 다음 다시 병합하여 정렬된 배열을 얻는 분할 정복 알고리즘입니다. 병합 정렬의 기본 아이디어는 각 하위 배열이 하나의 요소만 포함할 때까지 반복적으로 입력 배열을 절반으로 나눈 다음 하위 배열을 병합하여 정렬된 출력 배열을 형성하는 것입니다.
장단점
장점:
단점:
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
const middle = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, middle));
const right = mergeSort(arr.slice(middle));
return merge(left, right);
}
function merge(left, right) {
let result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
return result.concat(left, right);
}