정렬알고리즘은 컴퓨터 공학에서 중요시되는 문제 중 하나로, 어떤 데이터셋이 주어졌을 때 이를 정해진 순서대로 나열하여 재배치하는 문제이다.
실제 개발을 하다보면 불규칙한 데이터들을 정렬 후 탐색해야하는 경우가 꽤나 많이 발생하게 되는데 이때 상황에 맞는 알고리즘을 사용하여 효과적으로 문제를 해결할 수 있느냐가 핵심이라고 볼 수 있다.
시간복잡도가 O(2ⁿ)인 정렬 알고리즘은 크게 3가지가 있다
1. 선택 정렬(Selection sort)
2. 버블 정렬(Bubble sort)
3. 삽입 정렬(Insertion sort)
가장 작은것을 선택해서 제일 앞으로 이동시키는 알고리즘
선택정렬은 주어진 자료들 중에 현재 위치에 맞는 자료를 찾아 선택하여 위치를 교환하는 정렬 알고리즘이다. 한번 순회를 돌게되면 알고리즘 상 전체 자료 중 가장 작은 값의 자료가 0번째 인덱스에 위치하게 되므로 그 다음 순회부터는 1번 인덱스부터 순회를 돌며 반복하면 된다.
function selectionSort (input) {
const len = input.length;
for (let i = 0; i < len - 1; i++) {
let minIndex = i;
for (let j = i + 1; j < len; j++) {
if (input[j] < input[minIndex]) {
minIndex = j;
}
}
if (minIndex !== i) {
const temp = input[i];
input[i] = input[minIndex];
input[minIndex] = temp;
}
}
return input;
}
다음 값과 비교하여 작은것을 앞으로 큰것을 뒤로 이동시키는 알고리즘
버블정렬은 거의 모든 상황에서 최악의 성능을 보여주지만, 이미 정렬된 자료에서는 1번만 순회하면 되기 때문에 최선의 성능을 보여주는 알고리즘이다. 이미 정렬되어 있는 데이터를 왜 정렬하냐는 의문이 들 수 있지만, 정렬알고리즘 자체는 데이터가 정렬되어 있는지 아닌지 모르고 작동하는 것이기 때문에 의미는 있다.
function bubbleSort (input) {
const len = input.length;
let tmp = null;
for (let i = 0; i < len; i++) {
for (let j = 0; j < len; j++) {
if (input[j] > input[j + 1]) {
// Swap
tmp = input[j];
input[j] = input[j + 1];
input[j + 1] = tmp;
tmp = null;
}
}
if (!tmp) {
break;
}
}
return input;
}
왼쪽에서 오른쪽으로 가면서 각 요소를 왼쪽 요소들과 비교하여 알맞은 자리에 삽입하는 알고리즘
삽입정렬은 주어진 자료의 모든 요소를 앞에서부터 차례대로 정렬된 자료 부분과 비교하여 자신의 위치를 찾아 삽입하는 정렬이다.
삽입정렬은 최선의 경우 전체 자료를 한번만 순회하면 되기때문에 O(n)의 시간복잡도를 가지지만 최악의 경우 O(2ⁿ)의 시간복잡도를 가진다.
function insertionSort (input) {
const len = input.length;
for (let i = 1; i < len; i++) {
const value = input[i];
let j = i-1;
for (;j > -1 && input[j] > value; j--) {
input[j+1] = input[j];
}
input[j+1] = value;
}
return input;
}
https://blog.naver.com/ndb796/221226806398
https://evan-moon.github.io/2018/10/13/sort-algorithm/#%EC%82%BD%EC%9E%85%EC%A0%95%EB%A0%ACinsertion-sort