
반드시 이미 정렬된 배열에 대해 사용
배열에서 임의의 값을 선택, 찾으려는 값보다 임의의 값이 크면 임의의 값 왼쪽에서 재탐색(재귀).
찾으려는 값보다 임의의 값이 작으면, 임의의 값 오른쪽에서 재탐색(재귀)
public class BS_recur {
public static int binarySearch(int[] arr, int start, int end, int value) {
// 정렬되어 있는 배열 arr의 start부터 end까지에서 value의 idx를 찾는 함수
if (start > end) //start가 end보다 큰 경우 탐색 실패, 찾으려는 값이 없음
return -1;
else if (start == end) { // start가 end와 같은 경우
if (arr[start] == value) //찾으려는 값이 start인덱스에 있는 경우
return start; //(찾음!)
else //찾으려는 값이 없음
return -1;
} else {
int mid = (start + end) / 2; //중간값
if (arr[mid] == value) //중간 값이 찾으려는 값인 경우
return mid; //(찾음!)
else if (arr[mid] > value) //찾으려는 값보다 중간값이 큰 경우
return binarySearch(arr, start, mid - 1, value); //왼쪽에서 재탐색(재귀)
else //찾으려는 값보다 중간값이 작은 경우
return binarySearch(arr, mid + 1, end, value); //오른쪽에서 재탐색(재귀)
}
}
}
시간복잡도 분석

public class MergeSort {
public static void merge_sort(int array[],int start, int end){
if(end-start >= 1){
int mid = (start+end)/2;
merge_sort(array, start, mid);
merge_sort(array, mid+1, end);
int l = start;
int r = mid+1;
int newArray[] = new int[end-start+1];
int idx = 0;
while(l <= mid && r <= end){
if(array[l] < array[r]){
newArray[idx++] = array[l++];
}
else{
newArray[idx++] = array[r++];
}
}
while(l <= mid){
newArray[idx++] = array[l++];
}
while(r <= end){
newArray[idx++] = array[r++];
}
idx = 0;
for(int i = start ; i <= end ; i++){
array[i] = newArray[idx++];
}
}
}
}