정렬된 데이터 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입하여 정렬하는 방식으로 시간 복잡도가 O(n²)으로 효율적이지 않아 코딩 테스트에서는 많이 사용되지는 않는다.
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] arr = new int[] {5, 4, 1, 3, 2};
arr = insertSort(arr);
System.out.println(Arrays.toString(arr));
}
public static int[] insertSort(int[] arr) {
// 삽입 정렬은 index 1부터 시작하기 때문에 1부터 배열 크기만큼 정렬한다.
for(int i = 1; i < arr.length; i++) {
// key = 선택 데이터
int key = arr[i];
int j = i - 1;
// 4를 저장해두고 5 4 1 3 2 -> 5 5 1 3 2 -> 4 5 1 3 2
// 1을 저장해두고 4 5 1 3 2 -> 4 5 5 3 2 -> 4 1 5 3 2 -> 1 4 5 3 2
// 1 4 3 5 2 -> 1 3 4 5 2
// 1 3 4 2 5 -> 1 3 2 4 5 -> 1 2 3 4 5
// 선택 데이터보다 앞 인덱스에 큰 값이 존재하지 않을 때까지 위치 변경
while(j >= 0 && arr[j] > key) {
arr[j+1] = arr[j];
j--;
}
arr[j + 1] = key;
}
return arr;
}
}
삽입 정렬은 안정 정렬(Stable Sort)이다.
제자리 정렬(In-Place Sort)이다.
데이터가 거의 정렬되어 있을 때는 효율적이다.

각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력한다.
1초
삽입 정렬을 활용해 정렬해보자.
- Java에서 제공하는 정렬을 하면 되지만 삽입 정렬 공부를 위해 삽입 정렬을 통해 정렬을 해보자.
시간 초과는 생각할 필요 없다.
- N이 1,000보다 작기때문에 이중으로 반복을 수행해도 1,000,000이 나오기 때문에 시간초과에 대해 생각할 필요는 없다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
insertSort(arr);
int result = 0;
// 인덱스 기준 (0 + 0, 1 + 0, 1, 2 + ... + 0, 1, 2, ..., n)을 수행하기 위한 이중 for문
for(int i = 0; i < n; i++) {
result += arr[i];
for(int j = 0; j < i; j++) {
result += arr[j];
}
}
System.out.println(result);
}
static void insertSort(int[] arr) {
for(int i = 1; i < arr.length; i++) {
int data = arr[i];
int j = i - 1;
// arr[i] 값보다 앞쪽에 큰 값이 있으면 바로 인접한 값과 자리 교체
while(j >= 0 && arr[j] > data) {
arr[j+1] = arr[j];
j--;
}
// 자리교체가 모두 끝났으면 마지막으로 arr[i]값이 들어갈 위치와 자리 교체
arr[j+1] = data;
}
}
}