All files / binarySearch index.ts

96.07% Statements 49/51
88.88% Branches 16/18
100% Functions 4/4
96.07% Lines 49/51

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 521x 1x 1x 1x 1x 1x 1x 1x 32x 32x 32x 32x 61x 61x 61x 61x 26x 26x 26x 61x 28x 28x 28x 61x 25x 25x 32x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 3x 3x 3x 6x 3x 3x 3x 3x 3x 3x     3x  
/**
 * binary search a sorted array
 * return the index of the number if found or -1 if not found
 */
export const binarySearch = (
  arr: number[] | string[],
  search: number | string
) => {
  let left = 0;
  let right = arr.length - 1;
 
  while (left <= right) {
    const middle = Math.round((right + left) / 2);
 
    if (arr[middle] === search) return middle;
    if (arr[middle] > search) {
      // move right
      right = middle - 1;
    }
    if (arr[middle] < search) {
      // move left
      left = middle + 1;
    }
  }
 
  return -1;
};
 
// binary search with recursion
export const binarySearchRecursion = (
  arr: number[] | string[],
  search: number | string,
  offset: number = 0
): number => {
  const middle = Math.floor(arr.length / 2);
  // base case
  if (arr[middle] === search) return offset + middle;
  if (arr.length === 0) return -1;
 
  // recursion case
  if (arr[middle] > search)
    return binarySearchRecursion(arr.slice(0, middle), search, offset);
  if (arr[middle] < search)
    return binarySearchRecursion(
      arr.slice(middle + 1),
      search,
      offset + middle + 1
    );

  return -1;
};