1. 버블 정렬

1.1. 동작

https://gist.github.com/nansu0425/209a5f74b19d51212611931a259bd71c

1.2. 특징

  • 큰 값 부터 정렬된다
  • 원소 하나를 정렬하기 위해서 swap이 여러 번 일어날 수 있다
  • stable 정렬이다

1.3. 성능

  • 최상의 경우 시간 복잡도

    • 이미 정렬된 상태일 때 최상의 경우
    • 정렬되지 않은 영역을 순차적으로 탐색 후 swap이 한번도 일어나지 않으면 정렬 종료
    • 원소 개수 $n$이 증가할 때 수행 시간이 증가한다
    • 시간 복잡도: $O(n)$
  • 최악의 경우 시간 복잡도

    • 내림차순으로 정렬된 경우
    • 인덱스 $k$의 자리를 정렬된 상태로 만들기 위해선 $k$번의 비교가 필요하다
    • 마지막 인덱스 자리부터 인덱스 1번 자리까지 정렬된 상태로 만들면 모든 원소가 정렬된다
    • 원소 개수를 $n$이라고 할 때 비교 횟수는
    $$ \sum_{k=1}^{n - 1}k = \frac{n(n-1)}{2} $$
    • 시간 복잡도: $O(n^2)$
  • 공간 복잡도

    • 원소 개수가 늘어나도 필요한 메모리 크기는 같다
    • 공간 복잡도: $O(1)$

2. 선택 정렬

2.1. 동작

https://gist.github.com/nansu0425/1fda7bf785a346b2d596546d367a3bcc

2.2. 특징

  • 작은 값부터 정렬된다
  • 한 원소를 정렬할 때 swap은 한 번만 일어난다
  • unstable 정렬이다
    • ex) $(2, a), (2, b), (1, c)$일 때 숫자 기준으로 선택 정렬하면 $(1, c), (2, b), (2, a)$가 된다

2.3. 성능

  • 시간 복잡도

    • 최솟값을 찾을 때 정렬되지 않은 원소들 모두 탐색해야 한다
    • 원소가 이미 정렬된 상태여도 그 원소가 정렬된 상태인지 확인하기 위해 최솟값 탐색을 한다 → 최악의 경우와 최상의 경우 시간 복잡도가 같다
    • 원소 개수가 $n$개 일 때 비교 횟수는 $(n- 1) + (n -2) + ... + 1$ 이므로
    $$ \sum_{k=1}^{n - 1}k = \frac{n(n-1)}{2} $$
    • 시간 복잡도: $O(n^2)$
  • 공간 복잡도

    • 원소 개수가 늘어나도 필요한 메모리 크기는 같다
    • 공간 복잡도: $O(1)$

3. 삽입 정렬

3.1. 동작

https://gist.github.com/nansu0425/65502b86c70601cba73e76088f4cbed0

3.2. 특징

  • 작은 값부터 정렬된다
  • stable 정렬이다

3.3 성능

  • 최상의 경우

    • 이미 원소들이 정렬된 경우
    • 각 원소를 정렬된 자리에 있는지 한번 씩만 확인 후 수행 종료
    • 원소 개수 $n$이 증가하면 수행 시간이 증가
    • 시간 복잡도: $O(n)$
  • 최악의 경우

    • 내림차순으로 정렬된 경우
    • 원소 개수가 $n$개이고 인덱스 1번부터 $n - 1$번 원소의 삽입 위치를 찾기 위한 총 비교 횟수는 $1 + 2 + 3 + ... + (n - 1)$이므로
    $$ \sum_{k=1}^{n - 1}k = \frac{n(n-1)}{2} $$
    • 시간 복잡도: $O(n^2)$
  • 공간 복잡도

    • 원소 개수가 늘어나도 필요한 메모리 크기는 같다
    • 공간 복잡도: $O(1)$