삽입 정렬

  1. 삽입 정렬 알고리즘
  2. 삽입 정렬 예
  3. 삽입 정렬 알고리즘 구현
  4. 삽입 정렬 알고리즘 복잡성
삽입 정렬

삽입 정렬은 간단한 비교 기반 정렬 알고리즘입니다. 이 알고리즘에서 우리는 정렬 된 하위 배열과 정렬되지 않은 하위 배열의 두 가지 하위 배열을 유지합니다. 정렬되지 않은 하위 배열의 한 요소가 정렬 된 하위 배열에서 올바른 위치를 찾아 여기에 삽입됩니다. 누군가가 손에있는 카드 한 벌을 분류하는 방식과 유사합니다. 올바른 위치에 요소를 삽입 할 때 작동하므로 삽입 정렬이라고합니다. 이 알고리즘은 작은 데이터 세트에는 효율적이지만 큰 데이터 세트에는 적합하지 않습니다.

삽입 정렬 알고리즘

n 개의 요소를 포함하는 정렬되지 않은 배열A[]가 있다고 가정 해 보겠습니다. 첫 번째 요소A[0]은 이미 정렬되어 있으며 정렬 된 하위 배열에 있습니다.

  • 정렬되지 않은 하위 배열A[1]의 첫 번째 요소를 키로 표시합니다.
  • 그런 다음 키가 정렬 된 하위 배열의 요소와 비교됩니다. 여기에는A[0]이라는 하나의 요소 만 있습니다.
  • 키가A[0]보다 크면A[0]뒤에 삽입합니다.
  • 그렇지 않은 경우 더 작 으면 다시 비교하여A[0]앞의 올바른 위치에 삽입합니다. (A[0]의 경우 위치가 하나만 있음)
  • 다음 요소A[2]를 키로 사용합니다. 정렬 된 하위 배열 요소와 비교하여A[2]보다 작은 요소 뒤에 삽입합니다. 작은 요소가 없으면 정렬 된 하위 배열의 시작 부분에 삽입합니다.
  • 정렬되지 않은 하위 배열의 모든 요소에 대해 위 단계를 반복합니다.

삽입 정렬 예

배열이(5,3,4,2,1)이라고 가정합니다. 삽입 정렬 알고리즘을 사용하여 정렬합니다.

정렬 된 하위 배열 정렬되지 않은 하위 배열 정렬
(5) (3, 4, 2, 1) (5, 3, 4, 2, 1)
  • 첫 번째 반복

키 :A[1]= 3

정렬 된 하위 배열 정렬되지 않은 하위 배열 정렬
(3, 5) (4, 2, 1) (3, 5, 4, 2, 1)
  • 두 번째 반복

키 :A[2]= 4

정렬 된 하위 배열 정렬되지 않은 하위 배열 정렬
(3, 4, 5) (2, 1) (3, 4, 5, 2, 1)
  • 세 번째 반복

키 :A[3]= 2

정렬 된 하위 배열 정렬되지 않은 하위 배열 정렬
(2, 3, 4, 5) (1) (2, 3, 4, 5, 1)
  • 네 번째 반복

키 :A[4]= 1

정렬 된 하위 배열 정렬되지 않은 하위 배열 정렬
(1, 2, 3, 4, 5) () (1, 2, 3, 4, 5)

삽입 정렬 알고리즘 구현

#include <iostream>
using namespace std;

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

int main() {
  int n = 5;
  int arr[5] = {5, 3, 4, 2, 1};
  cout << "Input array: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
  insertion_sort(arr, n);  // Sort elements in ascending order
  cout << "Output array: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
}

삽입 정렬 알고리즘 복잡성

시간 복잡성

  • 평균 사례

평균적으로 i는 삽입 정렬의 i번째 패스에서 비교된다. 따라서 n 개의 반복이있는 경우 평균 시간 복잡도는 아래와 같습니다.

1 + 2 + 3 + ... + (n-1) = n*(n-1)/2

따라서 시간 복잡도는 [Big Theta] : O(n2) 정도입니다.

  • 최악의 경우

최악의 경우는 배열이 역으로 정렬되고 최대 비교 및 ​​스와핑 횟수를 수행해야하는 경우에 발생합니다.

최악의 경우 시간 복잡도는 [Big O] : O(n2)입니다.

  • 베스트 케이스

최상의 경우는 배열이 이미 정렬 된 다음 외부 루프 만 n 번 실행될 때 발생합니다.

최적의 시간 복잡도는 [Big Omega] :O(n)입니다.

공간 복잡성

삽입 정렬 알고리즘의 공간 복잡성은 임시 변수 이외의 추가 메모리가 필요하지 않기 때문에O(n)입니다.

튜토리얼이 마음에 드시나요? DelftStack을 구독하세요 YouTube에서 저희가 더 많은 고품질 비디오 가이드를 제작할 수 있도록 지원해주세요. 구독하다
Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn

관련 문장 - Sort Algorithm