1
+ /**
2
+ * @function binarySearch
3
+ * @description binary search algorithm (iterative & recursive implementations) for a sorted array.
4
+ *
5
+ * The algorithm searches for a specific value in a sorted array in logarithmic time.
6
+ * It repeatedly halves the portion of the list that could contain the item,
7
+ * until you've narrowed down the possible indices to just one.
8
+ *
9
+ * @param {number[] } array - sorted list of numbers
10
+ * @param {number } target - target number to search for
11
+ * @return {number } - index of the target number in the list, or -1 if not found
12
+ * @see [BinarySearch](https://www.geeksforgeeks.org/binary-search/)
13
+ * @example binarySearch([1,2,3], 2) => 1
14
+ * @example binarySearch([4,5,6], 2) => -1
15
+ */
16
+
17
+ export const binarySearchIterative = ( array : number [ ] , target : number ) : number => {
18
+ if ( array . length === 0 ) return - 1 ;
19
+
20
+ // declare pointers for the start, middle and end indices
21
+ let start = 0 ,
22
+ end = array . length - 1 ,
23
+ middle = ( start + end ) >> 1 ;
24
+
25
+ // ensure the target is within the bounds of the array
26
+ if ( target < array [ start ] || target > array [ end ] ) return - 1 ;
27
+
28
+ while ( array [ middle ] !== target && start <= end ) {
29
+ // if the target is less than the middle value, move the end pointer to be middle -1 to narrow the search space
30
+ // otherwise, move the start pointer to be middle + 1
31
+ if ( target < array [ middle ] )
32
+ end = middle - 1 ;
33
+ else
34
+ start = middle + 1 ;
35
+ // redeclare the middle index when the search window changes
36
+ middle = ( start + end ) >> 1 ;
37
+ }
38
+ // return the middle index if it is equal to target
39
+ return array [ middle ] === target ? middle : - 1 ;
40
+ }
41
+
42
+ export const binarySearchRecursive = ( array : number [ ] , target : number , start = 0 , end = array . length - 1 ) : number => {
43
+ if ( array . length === 0 ) return - 1 ;
44
+
45
+ // ensure the target is within the bounds of the array
46
+ if ( target < array [ start ] || target > array [ end ] ) return - 1 ;
47
+
48
+ const middle = ( start + end ) >> 1 ;
49
+
50
+ if ( array [ middle ] === target ) return middle ; // target found
51
+ if ( start > end ) return - 1 ; // target not found
52
+
53
+ // if the target is less than the middle value, move the end pointer to be middle -1 to narrow the search space
54
+ // otherwise, move the start pointer to be middle + 1
55
+ return target < array [ middle ]
56
+ ? binarySearchRecursive ( array , target , start , middle - 1 )
57
+ : binarySearchRecursive ( array , target , middle + 1 , end ) ;
58
+ }
0 commit comments