-
[자료구조] 이진삽입정렬(BinaryInsertionSort)자료구조 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; }

차례대로 잘 정렬되어 나온다
과정도 출력되게 하였다.
내려갈때마다 한 개씩 더 정렬되고 있다.
출력되는 걸 보면 일반 삽입정렬과 동일한 결과지만
삽입위치를 이진탐색으로 찾는다는게 차이점이다
'자료구조' 카테고리의 다른 글
[자료구조] 이진탐색트리의 삭제과정 (0) 2023.02.02 [자료구조] 이진탐색트리(BinarySearchTree) (0) 2023.02.02 [자료구조] 힙(HEAP) 구현 (1) 2023.01.14 [자료구조] 우선순위 큐와 힙 (0) 2023.01.13 [자료구조] 수식트리의 구현 (0) 2023.01.13