int binary_search_recursive(int *seq, int lbound, int ubound, int val) { int i=(lbound+ubound)/2; if(ubound<lbound) return -1; if(seq[i]==val) return i; else if(seq[i]>val) return binary_search_recursive(seq, lbound, i-1, val); return binary_search_recursive(seq, i+1, ubound, val); }
// plain ol' binary search, this time recursive int binary_search_recursive(int *array, int low, int high, int value) { int middle = (low + high) / 2; if(low > high) return -1; if(array[middle] == value) { return middle; } else if(array[middle] < value) { return binary_search_recursive(array, middle+1, high, value); } else { return binary_search_recursive(array, low, middle-1, value); } }
// __expected:binary_search_recursive(imin => $_retval, imax => $_retval, key => $_retval, A => $_retval, A => A) int binary_search_recursive(int A[], int key, int imin, int imax) { // test if array is empty if (imax < imin) // set is empty, so return value showing not found return KEY_NOT_FOUND; else { // calculate midpoint to cut set in half int imid = midpoint(imin, imax); // three-way comparison if (A[imid] > key) // key is in lower subset return binary_search_recursive(A, key, imin, imid - 1); else if (A[imid] < key) // key is in upper subset return binary_search_recursive(A, key, imid + 1, imax); else // key has been found return imid; } }
int main() { int arr[] = { 5, 3, 2, 4, 1, 4, 3, 2, 6, 2, 7 }; int length = sizeof(arr) / sizeof(int); print_array(arr, length); bubble_sort(arr, length); //selection_sort(arr, length); //insertion_sort(arr, length); print_array(arr, length); printf("%d\n", binary_search(arr, length, 2)); printf("%d\n", binary_search_recursive(arr, 0, length, 2)); return 0; }