이미 정렬된 데이터 범위에 정렬되지 않은 데이터를 적절한 위치에 삽입시켜 정렬하는 방식
시간 복잡도 : O(N^2)
느린 편 + 구현이 쉬움
핵심 : 선택 데이터를 현재 정렬된 데이터 범위 내에서 적절한 위치에 삽입하는 것
적절한 삽입 위치를 탐색하는 부분에서 이진 탐색 등과 같은 탐색 알고리즘을 사용하면 시간 복잡도를 줄일 수 있다.
public class InsertionSort {
public static void main(String[] args) throws IOException {
int N = readInt();
int[] A = new int[N];
int[] S = new int[N];
for (int i = 0; i < N; i++) A[i] = readInt();
for (int i = 1; i < N; i++) {
int insertion_point = i;
int insertion_value = A[i];
for (int j = i - 1; j >= 0; j--) {
if (A[j] < A[i]) {
insertion_point = j + 1;
break;
}
if (j == 0) insertion_point = 0;
}
for (int j = i; j > insertion_point; j--) {
A[j] = A[j - 1];
}
A[insertion_point] = insertion_value;
}
S[0] = A[0];
for (int i = 1; i < N; i++) {
S[i] = S[i - 1] + A[i];
}
int sum = 0;
for (int i = 0; i < N; i++) {
sum += S[i];
}
System.out.println(sum);
}
static int readInt() throws IOException {
int c, n = System.in.read() & 15;
while ((c = System.in.read()) > 32) n = (n << 3) + (n << 1) + (c & 15);
return n;
}
}
ref : Do It 알고리즘 코딩 테스트 자바편 by 김종관