
- target을 지정해준다. (첫번째 타겟은 두번째 원소)
- 타겟에 위치한 값과 타겟으로 부터 왼쪽에 위치한 값을 비교해준다.
- 타겟의 값이 왼쪽에 위치한 요소들보다 더 작은 경우, 큰 값들을 오른쪽으로 밀어준다.
3.1 이 때, 타겟의 값이 왼쪽의 위치한 요소보다 작지 않으면, 왼쪽은 이미 정렬이 되어 있다고 가정하므로 비교 작업을 멈추고 다음 타겟의 비교를 시작한다.- 타겟의 값을 변경된 인덱스에 배치해준다.

package hw_0928;
public class InsertionSort {
public static int[] insertionSort(int [] arr) {
for(int i=1;i<arr.length;i++) {
int target = arr[i];
int j;
for(j = i-1 ; j>=0; j--) {
//타겟의 값이 자신의 왼쪽에 있는 값보다 작다면
if(target < arr[j]) {
arr[j+1] = arr[j]; // 배열의 요소를 하나 밀어줌
//왼쪽의 요소와 비교해서 , 더 크면 이미 정렬이 되어있다고 가정했기 때문에 반복문 탈출
}else {
break;
}
}
arr[j+1] = target;
}
return arr;
}
public static int[] insertionSort2(int []arr) {
for(int i=1;i<arr.length;i++) {
int target = arr[i];
int j = i-1;
while(j>=0 && arr[j] > target) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = target;
}
return arr;
}
public static void printArr(int []arr) {
for ( int element : arr) {
System.out.print(element + " ");
}
System.out.println();
}
public static void main(String[] args) {
int arr[] = { 12,2,1,6,8,3,52,45 };
System.out.println("-----정렬 전-----");
printArr(arr);
System.out.println("-----정렬 후-----");
insertionSort(arr);
printArr(arr);
}
}

오늘은 삽입 정렬을 구현해 보았습니다.
이론적으로는 금방 이해 했지만, 타겟보다 큰 값들을 뒤로 밀어주는 것을 코드로 표현하는데 있어 조금 어렵게 생각했던 것 같습니다.
최선의 경우 또한 고려해주지 못했고, 레퍼런스를 보며 이해할 수 있었습니다.
이를 통해, 삽입 정렬이 O(n^2)의 평균 시간 복잡도를 가지는 다른 정렬 방법보다 기대 비교 횟수가 더 작아 어느 정도 정렬이 되어 있는 배열에서는 효율이 좋다는 것을 이해할 수 있었습니다.