이번 포스팅 내용은 삽입정렬입니다.
삽입 정렬은 선택 정렬의 정렬방식과 유사합니다.
선택 정렬이 정해진 위치에 조건에 부합하는 자료구조 내 원소들끼리 비교하여 하나의 원소를 배치 했다면
삽입 정렬은 조건에 부합하는 자료구조 내 원소들이 정해진 위치를 향해 이동합니다.
그럼 아래에서 더 자세히 알아보겠습니다.
1. 삽입 정렬 ( Insertion Sort )이란?
삽입정렬은 이름에서 대략적인 동작 방식을 표현하고 있습니다.
정렬하고자 하는 공간을 임시로 빈 공간으로 만들고 비교 대상 데이터들이 조건에 부합한다면 해당 위치로 이동시킵니다.
기존에 해당 위치에 있던 데이터는 남아있는 빈 공간으로 "삽입" 됩니다.
2. 삽입 정렬의 진행
더 자세히 알아 볼까요?
삽입정렬은 자료구조 내 두번째 원소부터 마지막 원소까지 순차적으로 이동하며 시행됩니다.
각 패스스루 마다 채워 넣을 위치가 주어지고 해당 위치에 있는 데이터를 임시 공간에 저장하여 해당 위치를 빈 공간으로 만들어 줍니다.
이 후 임시 공간에 있는 데이터와 빈공간 보다 앞에 있는 ( 왼쪽에 위치한 ) 데이터들을 비교하며 조건에 부합할 시 빈공간을 향해 (오른쪽으로) 이동하여 빈 공간을 매꿉니다.
조건에 부합하지 않는 원소를 만나거나 순회 범위의 시작부분에 도달하게 되면 해당 패스스루를 종료합니다.
3. 삽입 정렬의 코드 구현
function insertionSort(arr) {
// index : 패스스루가 채워 넣을 위치
for (let index = 1; index < arr.length; index++) {
// position : 비어있는 자료구조 위치
let position = index;
// temp : 패스스루가 채워넣을 위치의 데이터
const temp = arr[index];
// 빈 공간이 시작 위치까지 이동 할 때까지 진행
while (position > 0) {
// 저장해놓은 데이터와 비어있는 공간의 앞(왼쪽)에 위치한 데이터를 비교하여
// 비어있는 공간의 앞(왼쪽)에 위치한 데이터 크다면 비어있는 공간의 앞의 데이터 뒤로(오른쪽) 이동
// 이동하면 이동한 데이터의 위치는 비어있는 상태
if (temp < arr[position - 1]) {
arr[position] = arr[position - 1];
position--;
} else {
// 조건에 부합하지 않는 값 직면 시 패스스루 종료
break;
}
}
// 비어있는 공간에 패스스루가 채워넣을 위치에 존재하던 데이터 삽입
arr[position] = temp;
}
return arr;
}
4. 삽입 정렬의 효율성
- 시간 복잡도
* 최악의 시나리오인 내림차순인 경우 범위에 있는 모든 데이터를 이동해야 하기 때문에
1번째 패스스루에서 $N-1$단계
2번째 패스스루에서 $N-2$단계
....
마지막 패스스루에서 1단계로
$(N-1) + (N-2) +... + 1 = N(N-1)/2$
$O(N(N-1)/2)$ = $O(N^2)$ 가 나오게 됩니다.
* 최선의 시나리오인 오름차순 정렬이 되어있는 경우 각 패스스루마다 비교 연산이 1회만 이루어지기 때문에
$O(N)$ 가 나오게 됩니다.
- 공간 복잡도
주어진 공간 내에서 교환을 통해 정렬되므로 $O(N)$입니다.
4. 삽입 정렬의 장단점
- 장점
* 거품 정렬, 선택 정렬 등 동일한 $O(N^2)$ 시간복잡도 카테고리의 정렬 알고리즘 중 상대적 효율성 높음
* 자료 구조 내에서만 교환이 이루어져 별도 메모리 사용 없음 => 제자리 정렬
* 중복된 값인 경우에도 입력 순서로 정렬 보장 => 안정 정렬
- 단점
* 평균과 최악의 시나리오의 시간 복잡도가 비효율적 - $O(N^2)$
마치며
다른 분들은 단순한 정렬 알고리즘이라 하시는데 저에게는 단순하지 않네요....
참고 자료에서 손안에 있는 카드를 정렬하는 방식과 비슷하다는 글을 보았는데 참 와닿았습니다.
출처
'알고리즘-이론' 카테고리의 다른 글
재귀 (2) : 미래의 나야, 부탁해~ (0) | 2023.03.14 |
---|---|
재귀 (1) : Call me (1) | 2023.03.11 |
선택 정렬 - 자리를 얻기 위한 경쟁 (0) | 2023.03.08 |
거품 정렬 - 뽀글뽀글 (0) | 2023.03.08 |
Big-O Notation - 시간 복잡도 (0) | 2023.03.07 |