Now that the basic framework is working, it is time to begin implementing a few alternative search functions. Each of these search algorithms have strengths and weaknesses, depending on the distribution of the input and the search keys used. The classic solution to this problem is binary search. Binary search is a divide-and-conquer algorithm. See Levitin  pp 162 for a detailed description of this algorithm.
ALGORITHM BinarySearch (A[0 . . . n - 1], k)// Non-recursive binary search in an ordered list.// INPUT : An array A[0 . . . n - 1] of ordered elements, and a search key k.// OUTPUT : an index to the position of k in A if k is found or -1 otherwise.1: l ← 0; r ← n - 12: while l ≤ r do3: m ← ⌊(l + r)/2⌋4: if A[m] = k then5: return m6: else if k < A[m] then7: r ← m- 18: else
9: l ← m+ 1
10: return -1
Algorithm BinarySearch shows the pseudocode for this solution. Implement the algorithm.