Insertion Sort, 삽입 정렬
2021-02-11
Insertion sort, best=O(n), average=O(n^2), worst=O(n^2), memory=O(1)
두번째 인덱스부터 시작하여, 자신이 있어야할 위치를 앞쪽으로 찾는다. 있어야할 위치가 아니면 밀어놓는다. (아래서 설명)
8 5 6 2 4
1번째 루프, 인덱스(1)에 있는 5가 들어갈 곳을 앞에서부터 찾는다.
5와 8을 비교해서 8이 더 크니까 5가 있던 자리로 8을 밀어놓는다.
8 [5] 6 2 4 -> > 8 6 2 4 -> [5] 8 6 2 4
2번째 루프, 인덱스(2)에 있는 6이 들어갈 곳을 앞에서부터 찾는다.
6과 8을 비교하여 8이 크므로 6이 있던자리에 8을 밀어놓는다.
6과 5를 비교하여 6이 크니까 해당 자리에 6을 넣는다.(insert)
5 8 [6] 2 4 -> 5 > 8 2 4 -> 5 [6] 8 2 4
3번째 루프, 인덱스(3)에 있는 2가 들어갈 곳을 앞에서부터 찾는다.
5 6 8 [2] 4 -> 5 6 > 8 4 -> 5 > 6 8 4 -> [2] 5 6 8 4
4번째 루프, 인덱스(4)에 있는 4가 들어갈 곳을 앞에서부터 찾는다.
2 5 6 8 [4] -> 2 5 6 > 8 -> 2 5 > 6 8 -> 2 > 5 6 8 -> 2 [4] 5 6 8
예제
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.stream.IntStream;
public class InsertionSort {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(InsertionSort.class);
int arrLength = 10;
int[] arr = new int[arrLength];
IntStream.range(0, arrLength).forEach(i -> arr[i] = (int) (Math.random()*arrLength*10));
logger.debug("before arr -> {}", Arrays.toString(arr));
for(int i=1; i<arrLength; i++) {
int currentPivot = arr[i];
int j=i-1;
while(j>=0 && arr[j] > currentPivot) {
arr[j+1] = arr[j];
j--;
}
// for(; j>=0; j--) {
// if(currentPivot < arr[j]) {
// arr[j+1] = arr[j];
// } else {
// break;
// }
// }
arr[j+1] = currentPivot;
}
logger.debug("after arr -> {}", Arrays.toString(arr));
}
}