정렬 알고리즘 중 가장 기본 적인 3가지를 정리해보겠습니다.
거품 정렬은 앞에서 부터 두 개의 아이템을 비교해 나가면서 둘 중 큰 값을 오른쪽 작은 값을 왼쪽으로 정렬하는 알고리즘 입니다.
const bubbleSort = (arr) => {
const length = arr.length;
for (let i = 0; i < length; i++) {
for (let j = 0; j < length; j++) {
// 왼쪽 아이템이 오른쪽 아이템 보다 크다면
if (arr[j] > arr[j + 1]) {
// 서로 교환
const temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
};
선택 정렬은 먼저 배열의 첫 원소를 저장하고 나머지 원소들과 비교하여 해당 원소보다 작은값이 있으면 그값을 대신 저장해 가면서 가장 작은 값을 찾습니다. 이렇게 찾은 가장 작은 값을 배열의 시작점에 있는 값과 위치를 바꿔주고 다음 위치로 넘어가서 이 과정을 반복해 주는 알고리즘 입니다.
(다르게 표현하자면 해당 순서에 원소를 넣을 위치는 이미 정해져 있고, 어떤 원소를 넣을지 선택하는 알고리즘입니다.)
const selectionSort = (arr) => {
const length = arr.length;
for (let i = 0; i < length; i++) {
let minIndex = i;
// j가 i+1에서 시작하지 않으면 이미 정렬된 원소들까지 다시 과정에 포함시킵니다
for (let j = i + 1; j < length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
const temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
};
실제 인간이 정렬하는 논리와 유사합니다.
두 번째 원소부터 시작하여 그 앞(왼쪽)의 원소들과 비교해가며, 타겟 원소의 값이 비교 원소값보다 크다면 비교 원소 뒤로 자리를 옮겨 주는 알고리즘 입니다.
const insertionSort = (arr) => {
let n = arr.length;
for (let i = 1; i < n; i++) {
// 시작점
let current = arr[i];
let j = i - 1;
while (j > -1 && current < arr[j]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = current;
}
return arr;
};
현재 원소(current)가 비교원소(arr[j])보다 작으면 비교원소를 하나씩 뒤로 밀어주고(arr[j+1]). 비교원소 보다 크거나 같으면 현재 원소를 비교원소 바로뒤로 옮겨준다(arr[j + 1] = current)
시간복잡도: O(n^2)
참고- Tech Interview