자료구조
[자료구조] 이진삽입정렬(BinaryInsertionSort)
mintuchel
2023. 1. 30. 17:00
[이진삽입정렬]

이진삽입정렬은 삽입정렬과 메커니즘은 똑같지만 삽입위치를 이진탐색(BinarySearch) 으로 찾는다.
원소가 들어 갈 위치를 선형 탐색이 아닌 이분 탐색(이진탐색)을 이용한 방법으로 구현한다.
일반적인 삽입정렬은 선형 탐색이다보니 한 원소에 대해 비교 작업이 최대 N번이 일어난다.
하지만 이진삽입정렬은 탐색 과정을 이분탐색을 통해 log2n의 탐색시간복잡도를
갖도록 하기 때문에 비교연산횟수가 줄어든다!
[BinarySearch]
int BinarySearch(int arr[], int left, int right, int target) {
// 종료부분
if (right - left == 1) {
if (target > arr[left]) return right;
else return left;
}
int mid = (left + right) / 2;
if (target > arr[mid]) {
return BinarySearch(arr, mid, right, target);
}
// target < arr[mid]
else {
return BinarySearch(arr, left, mid, target);
}
}
일반적인 BinarySearch와는 다른 목적의 함수를 구현해보았다.
일반 BS는 target값의 idx를 반환하는 역할이지만
여기서의 BS의 목적은 target값이 들어갈 위치 idx를 반환하는 것이다.
따라서 종료부분이 다르다.
[BInsertionSort]
void BInsertionSort(int arr[],int len) {
for (int i = 1; i < len; i++) {
int temp = arr[i];
int location = BinarySearch(arr, 0, i, temp);
for (int k = i-1; k >=location; k--) {
arr[k + 1] = arr[k];
}
arr[location] = temp;
}
}
[main]
int main() {
int arr[SIZE] = { 5,8,1,4,2,6,10,9,3,7 };
BInsertionSort(arr,SIZE);
return 0;
}

차례대로 잘 정렬되어 나온다
과정도 출력되게 하였다.
내려갈때마다 한 개씩 더 정렬되고 있다.
출력되는 걸 보면 일반 삽입정렬과 동일한 결과지만
삽입위치를 이진탐색으로 찾는다는게 차이점이다