Insertion-Sort algorithm

마인드

  • 빈 왼손에 카드를 넣으면서 정렬한다고 생각
  • 손에 많은 카드를 잡기 힘드니 크기가 작은 정렬 에 좋다

pseudo code

for i = 1 to A.length
    key = A[i]  // 여기서 A[i] 정렬초기 조건을 만족하는  A[1]  정렬  
    j = i - 1
    while j >= 0 and A[j] > key
        A[j + 1] = A[j]
        j = j - 1
    A[j + 1] = key

루프의 불변성

  • A[i]는 정렬된 상태, 즉 왼손이 쥐고 있는 카드라고 생각
    • A[1 .. i-1]은 정렬된 상태
    • A[i+1 .. n]은 정렬되지 않은 상태
  • A[1 .. i-1]를 루프의 불변성
    • 뭔가 간단하게 말하면 루프시작하기전에 정렬되어 있는가? 이다

루프 불변성 조건 3가지

  • 초기조건 : 루프가 첫번째 반복을 시작하기 전에 루프 불변성이 참이여야 한다.
  • 유지조건 : 루프가 다음 반복을 시작하되기 전까지도 불변성이 참이여야 한다.
  • 종료조건 : 루프가 종료될 때 그 불변식이 알고리즘의 타당성을 보이는데 도움이 될 유용한 특성을 가져야 한다.

Insertion-Sort from wikipedia


Appendix

시간복잡도

  • 최선의 경우 : O(n)
  • 최악의 경우 : O(n^2)
  • 평균의 경우 : O(n^2)

공간복잡도

  • O(1)

안정성

  • 안정정렬

C++ 코드

#include <iostream>
#include <vector>
using namespace std;

void insertionSort(vector<int> &arr) {
    int n = arr.size();
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

int main() {
    vector<int> arr = { 5, 2, 4, 6, 1, 3 };
    insertionSort(arr);
    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }
    return 0;
}

python 코드

def insertionSort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key

arr = [5, 2, 4, 6, 1, 3]
insertionSort(arr)
print(arr)

java 코드

public class InsertionSort {
    public static void main(String[] args) {
        int[] arr = { 5, 2, 4, 6, 1, 3 };
        insertionSort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    public static void insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int key = arr[i];
            int j = i - 1;
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
    }
}