자료구조 및 알고리즘

삽입 정렬

yu_gyeong 2023. 12. 3. 17:04

1. 개념

  • 새로운 숫자가 삽입될 때 정렬된 배열 안에서 자신의 위치를 찾아가며 정렬하는 알고리즘

2. 구현 (kotlin)

fun insertionSort(arr: IntArray) {
    for (i in 1 until arr.size) { // i = 현재 정렬된 배열의 크기
        val key = arr[i]
        var j = i - 1 // 정렬된 배열에서 제일 큰 숫자의 인덱스(가장 오른쪽에 있는 숫자의 인덱스)
        while (j >= 0 && arr[j] > key) { // 정렬된 배열에서 제일 큰 숫자의 인덱스부터 0번 인덱스까지 비교하면서 현재 값이 key보다 크면,
            arr[j + 1] = arr[j] // 현재 값을 한 칸 오른쪽에 덮어 씌운다.
            j -= 1
        }
        arr[j + 1] = key // 올바른 위치에 key 삽입
    }

    arr.forEach {
        print("$it ")
    }
}

3. 정렬 과정

4. 시간복잡도와 공간복잡도

시간복잡도

  • Best

    • 오름차순으로 정렬되어 있는 경우, 내부 while문이 동작하지 않으므로, O(N)의 시간복잡도를 가진다.
  • Worst

    • 내림차순으로 정렬되어 있는 경우, 매번 내부 while문이 동작하므로, O(N2)의 시간 복잡도를 가진다.

공간복잡도

  • 별도의 추가 공간을 사용하지 않고, 주어진 배열 내에서 값의 위치만 바뀌기 때문에 O(1)의 공간 복잡도를 가진다.

면접 예상 질문

  1. 삽입 정렬의 시간복잡도를 Best, Worst 케이스로 나눠 설명해주세요.
  2. 삽입 정렬을 구현해주세요.

참고 URL

https://youtu.be/iqf96rVQ8fY?si=O83YiZU4ni9QWKOa
https://chlgpdus921.github.io/algorithm/sort/insertion

'자료구조 및 알고리즘' 카테고리의 다른 글

힙 정렬  (0) 2024.01.08
퀵 정렬  (0) 2023.12.15
합병 정렬  (1) 2023.11.19
버블 정렬  (0) 2023.11.17
선택 정렬  (0) 2023.11.16