2번째 원소부터 시작하여 그 앞(왼쪽)의 원소들과 비교하여 삽입할 위치를 지정한 후,
원소를 뒤로 옮기고 지정된 자리에 자료를 삽입 하여 정렬하는 알고리즘

public class p03_insertSort { // 오름차순 public static int[] solution(int n, int[] arr){ for(int i = 1; i < n; i++){ // 삽입 대상 순회 int tmp = arr[i]; // 삽입 대상 int j; for(j = i-1; j >= 0; j--){// i번째 이전을 순회하면서 삽입 대상을 어디에 삽입할지 선택 if(arr[j] > tmp) arr[j+1] = arr[j]; else break; // arr[j] < tmp 이면 j이전 인덱스의 값들이 tmp보다 작은 값이다. } arr[j+1] = tmp; // j번째 에서 else에 의해 for문을 빠져 나왔으므로, j+1 이전은 tmp보다 작은 값이고, j 이후는 tmp보다 큰 값을 갖고 있다. } return arr; } // 내림차순 public static int[] solution2(int n, int[] arr){ for(int i = 1; i < n; i++){ // 삽입 대상 순회 int tmp = arr[i]; // 삽입 대상 int j; for(j = i-1; j >= 0; j--) { if(arr[j] < tmp) arr[j+1] = arr[j]; else break; } arr[j+1] = tmp; } return arr; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++) arr[i] = sc.nextInt(); int[] answer = solution(n, arr); for(int x: answer) System.out.print(x+" "); } }
시간복잡도
최선의 경우(모두 정렬된 경우) O(n), 최악의 경우(역으로 정렬되어 있는 경우) O(n^2)
공간복잡도
주어진 배열 안에서 교환을 통해 정렬이 수행되므로 O(n) 이다.
장점
- 대부분의 원소가 정렬되어 있는 경우 효율적
- 정렬하고자 하는 배열 안에서 교환하는 방식이므로, 다른 메모리 공간을 필요로 하지 않는다. => 제자리 정렬(in-place sorting)
- 안정 정렬(Stable Sort) 이다.
- Selection Sort나 Bubble Sort과 같은 O(n^2) 알고리즘에 비교하여 상대적으로 빠르다.
단점
- 평균과 최악의 시간복잡도가 O(n^2)으로 비효율적이다.
- Bubble Sort와 Selection Sort와 마찬가지로, 배열의 길이가 길어질수록 비효율적이다.
source
https://gyoogle.dev/blog/algorithm/Insertion%20Sort.html
삽입 정렬(Insertion Sort) | 👨🏻💻 Tech Interview
삽입 정렬(Insertion Sort) Goal Insertion Sort에 대해 설명할 수 있다. Insertion Sort 과정에 대해 설명할 수 있다. Insertion Sort을 구현할 수 있다. Insertion Sort의 시간복잡도와 공간복잡도를 계산할 수 있다. In
gyoogle.dev
'CS > 알고리즘' 카테고리의 다른 글
[Algorithm] 퀵 정렬 (Quick Sort) (0) | 2023.03.12 |
---|---|
[Algorithm] 이분 탐색(Binary Search) (1) | 2023.03.12 |
[Algorithm] 거품 정렬 (Bubble Sort) (0) | 2023.03.12 |
[자료구조] 스택(Stack) 과 큐(Queue) (0) | 2023.03.12 |
[Algorithm] 투포인터(Two Pointer) & Sliding Window (0) | 2023.03.12 |