삽입 정렬(Insertion Sort)

image 1.gif

버블 정렬(Bubble Sort)의 비효율성을 개선하기 위해 등장한 정렬이다.

버블 정렬이 i번째와 i+1번째를 비교하며 위치를 바꿨다면

삽입 정렬은 배열을 정렬된 부분정렬되지 않은 부분으로 나누고, 정렬되지 않은 부분의 첫 번째 원소를 정렬된 부분과 비교한다.
그리고 자신보다 작은 값이 발견될 때, 그 위치에 삽입하는 방식의 정렬이다

삽입 정렬은 버블 정렬의 비교, 교환 횟수를 줄임으로써 효율이 높다

시간 복잡도

평균, 최악은 O(N^2) 이다
하지만 최선의 경우 O(N)의 시간 복잡도를 가진다

공간 복잡도

주어진 배열 외에 다른 공간이 필요 없으므로 O(N) 이다

특징

선택 정렬(Selection Sort)과 삽입 정렬

둘은 i번째 반복 후 i가 정렬된 순서로 온다는 점에서 유사하지만, 삽입 정렬이 더 효율적이다
선택 정렬은 i+1번째 요소를 찾기 위해 나머지 모든 요소를 탐색하지만,
삽입 정렬은 배치를 위해 필요한 만큼의 요소만 탐색하기 때문이다

코드

function insertionSort(arr) {
  for(let i = 1; i < arr.length; i++) {
    let cur = arr[i];
    let left = i - 1;

    while(left >= 0 && arr[left] > cur) {
      arr[left + 1] = arr[left];
      left--;
    }
    arr[left + 1] = cur;
  }
  return arr;
}

const arr = [5, 3, 7, 39, 28, 6, 1];
console.log(insertionSort(arr)); // [1, 3, 5, 6, 7, 28, 39]