삽입정렬(Insertion Sort)
개념
손 안의 카드를 정렬하는 방법과 유사합니다.
Insertion Sort는 Selection Sort와 유사하지만, 좀 더 효율적인 정렬 알고리즘입니다.
Insertion Sort는 2번째 원소부터 시작하여 그 앞(왼쪽)의 원소들과 비교하여 삽입할 위치를 지정한 후, 원소를 뒤로 옮기고 지정된 자리에 자료를 삽입 하여 정렬하는 알고리즘입니다.
로직
데이터가 정렬되어 있음을 가정하고 값을 해당 위치에 삽입하여 정렬하는 방법
- 정렬은 2번째 위치(index)의 값을 temp에 저장합니다.
- temp와 이전에 있는 원소들과 비교하며 삽입해나갑니다.
- '1'번으로 돌아가 다음 위치(index)의 값을 temp에 저장하고, 반복합니다.
코드
InsertionSort.java
package Algorithm;
import java.util.Arrays;
import java.util.Random;
public class InsertionSort {
static final int N = 10;
public static void main(String[] args) {
Random random = new Random(); // 랜덤함수를 이용
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = random.nextInt(100); // 0 ~ 99
}
System.out.println("정렬 전: " + Arrays.toString(arr));
insertionSort(arr);
System.out.println("정렬 후: " + Arrays.toString(arr));
}
private static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > temp) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
}
}
console
정렬 전: [81, 14, 9, 34, 0, 88, 41, 89, 71, 26]
정렬 후: [0, 9, 14, 26, 34, 41, 71, 81, 88, 89]
시간복잡도
주어진 데이터의 개수가 $n$개일때
$$
\sum_{i=1}^{n-1}i=1+2+3+...+(n-1)=\frac{n(n-1)}{2}
$$
번의 비교를 하게 된다.
삽입정렬의 시간복잡도는 최악의 경우 $O(N^2)$이며
최선의 경우 $O(N)$이라는 엄청나게 빠른 효율성을 가지고 있어, 다른 정렬 알고리즘의 일부로 사용될 만큼 좋은 정렬 알고리즘입니다.
삽입 정렬의 평균 시간복잡도는 $O(N^2)$입니다.
장점
- 알고리즘이 단순하여 구현이 쉽다
- 대부분의 원소가 이미 정렬되어 있는 경우 매우 효율적일 수 있다.
- 추가적인 메모리 공간을 필요로 하지않는다
- 안정 정렬이다.
- 다른 $O(N^2)$의 시간복잡도를 갖는 알고리즘에 비해 효율적이다.
단점
- 평균과 최악의 시간복잡도가 $O(N^2)$으로 비효율적이다.
'Algorithm' 카테고리의 다른 글
퀵정렬(Quick Sort) (0) | 2020.07.19 |
---|---|
선택정렬(Selection Sort) (0) | 2020.07.19 |
거품정렬(Bubble Sort) (0) | 2020.07.19 |
[Algorithm] 최소신장트리(MST) (0) | 2019.11.10 |
[Algorithm] 최소신장트리(MST) - Kruskal (0) | 2019.11.10 |