삽입 정렬 알고리즘이란?
요소가 들어있는 배열을 i 로 반복할 때, 현재 i 위치 좌측으로 이미 요소가 정렬된 상태이고, i 값과 좌측의 값들을 비교해 i의 적절한 위치를 찾아 삽입하는 정렬 알고리즘이다.
삽입 정렬 알고리즘 코드 적용
const nums = [11, 7, 5, 6, 10, 9];
function insertionSort(nums) {
let N = nums.length;
for (let i = 1; i < N; i++) {
// i는 언제나 1번째부터 시작하고, temp 변수에 i의 현재 값을 보관한다.
let temp = nums[i];
// j는 언제나 i - 1의 위치에서 시작한다.
let j = i - 1;
// 만약에 j 가 0 이상이고, i위치의 값보다 j위치의 값이 더 큰 상태라면
// 즉 temp가 좌측에 있는 요소보다 작다면 올바를 위치를 찾을 때까지 반복문을 돌려준다.
while (j >= 0 && nums[j] > temp) {
// j의 바로 다음 위치에 이전 j 값을 담아주면서 칸을 한 칸씩 우측으로 이동시키고,
// j는 좌측으로 계속 이동시킨다.
nums[j + 1] = nums[j];
j--;
}
// 조건문을 벗어난 경우 최종적으로 temp의 위치가 확정되므로 j + 1의 위치에 temp를 삽입한다.
// j + 1인 이유는
// 1. j가 while문을 거치면서 계속 감소했기 때문이고
// 2. 만약 현재 잘 정렬이 된 상태라 while문에 진입하지 않았다면 현재 i의 자리에 temp가 들어간다. 즉 움직이지 않는다는 것.
nums[j + 1] = temp;
console.log(i, '회전: ', nums);
}
return nums;
}
const result1 = insertionSort(nums);
console.log(result1);
역으로 정렬이 되어있는 최악의 경우 O(n^2) 의 시간복잡도를 갖지만, 이미 대부분 정렬이 완료된 경우 비교 횟수가 적기 때문에 효율적이다.
'Algorithm & 자료구조 > 자료구조' 카테고리의 다른 글
[알고리즘 JS] 퀵정렬 알고리즘 : Quick Sort Algorithm (0) | 2022.10.11 |
---|---|
[알고리즘 JS] 버블 정렬 알고리즘 : Bubble Sort Algorithm (0) | 2022.08.31 |
[알고리즘 JS] 이진 검색 알고리즘 : Binary Search Algorithm (0) | 2022.07.26 |
[알고리즘 JS] 선택 정렬 알고리즘 : Selection Sort Algorithm (0) | 2022.07.22 |