모든 원소에 대해 해당 원소 앞에 이미 정렬된 배열에서 자신의 위치를 찾아 삽입하며 정렬하는 알고리즘
void InsertionSort() {
int[] nums = {1000, 400, 12, -59, 328, 121, -3};
// loop 1
for(int i = 1; i < nums.length; i++) {
//loop 2
for(int j = i-1; j >= 0; j--) {
// conditional 1
if(nums[j] > nums[j+1]) {
int temp = nums[j+1];
nums[j+1] = nums[j];
nums[j] = temp;
}
}
}
System.out.println(Arrays.toString(nums));
}
loop 1: 두 번째 원소부터 마지막 원소를 의미한다.
loop 2: 현재 원소의 앞에 있는 원소들을 의미한다.
conditional 1: 두 원소를 비교하고 큰 원소를 뒤로 밀어내며 자리를 찾아간다.
최악의 경우, 삽입 정렬과 마찬가지로 O(N^2) 이다.
모두 정렬되어 있는 최적의 경우, 원소들을 한 번씩만 비교하므로 O(N) 이다. 또한, 원소를 하나씩 삽입/삭제 하는 경우에는 오버헤드가 매우 적다.
배열의 크기가 작을 때 상당히 효율적이어서 배열의 크기가 클 때는 O(nlogn) 알고리즘을 쓰다가 삽입정렬도 전환하기도 한다.
단 하나의 배열에서만 진행되므로 O(n) 이다.
[참고]