삽입 정렬은 선택 정렬과 유사하지만, 좀 더 효율적인 정렬 알고리즘 방식이다.
삽입 정렬은 2번째 원소부터 시작하여, 그 앞의 원소들과 비교하여 삽입할 위치를 지정한 후 원소를 뒤로 옮기고 지정된 자리에 자료를 삽입하여 정렬하는 알고리즘이다.
최선의 경우 O(N)이라는 엄청나게 빠른 효율성을 갖고 있다.
void insertionSort(int[] arr) {
for(int i = 1; i < arr.length; i++) { // 1
int temp = arr[i];
int prev = i - 1;
while((prev >= 0) && (arr[prev] > temp)) { // 2
arr[prev+1] = arr[prev];
prev--;
}
arr[prev+1] = temp; // 3
}
System.out.println(Arrays.toString(arr));
}
최악의 경우(역으로 정렬되어 있을 경우) Selection Sort와 마찬가지로 O(n^2)이다.
하지만, 모두 정렬이 되어있는 경우 한번씩 밖에 비교를 안하므로 O(n)시간 복잡도를 갖게 된다. 이미 정렬되어있는 배열에 자료를 하나씩 삽입/제거하는 경우에는 최고의 정렬 알고리즘이 되는데 탐색을 제외한 오버헤드가 매우 적기 때문이다.
따라서 최선의 경우 O(n)의 시간복잡도를 갖고, 평균과 최악의 경우 O(n^2)의 시간복잡도를 갖게 된다.
주어진 배열 안에서 교환을 통해, 정렬이 수행되므로 O(n)이다.