diff --git a/Search/BinarySearch.js b/Search/BinarySearch.js index ed4dfa79a..3a150d638 100644 --- a/Search/BinarySearch.js +++ b/Search/BinarySearch.js @@ -1,26 +1,70 @@ -/* Binary Search-Search a sorted array by repeatedly dividing the search interval +/* Binary Search: https://en.wikipedia.org/wiki/Binary_search_algorithm + * + * Search a sorted array by repeatedly dividing the search interval * in half. Begin with an interval covering the whole array. If the value of the * search key is less than the item in the middle of the interval, narrow the interval * to the lower half. Otherwise narrow it to the upper half. Repeatedly check until the * value is found or the interval is empty. */ -function binarySearch (arr, i) { - var mid = Math.floor(arr.length / 2) - if (arr[mid] === i) { - console.log('match', arr[mid], i) - return arr[mid] - } else if (arr[mid] < i && arr.length > 1) { - binarySearch(arr.splice(mid, Number.MAX_VALUE), i) - } else if (arr[mid] > i && arr.length > 1) { - binarySearch(arr.splice(0, mid), i) +function binarySearch (arr, x, low = 0, high = arr.length - 1) { + const mid = Math.floor(low + (high - low) / 2) + + if (high >= low) { + if (arr[mid] === x) { + // item found => return its index + return mid + } + + if (x < arr[mid]) { + // arr[mid] is an upper bound for x, so if x is in arr => low <= x < mid + return binarySearch(arr, x, low, mid - 1) + } else { + // arr[mid] is a lower bound for x, so if x is in arr => mid < x <= high + return binarySearch(arr, x, mid + 1, high) + } } else { - console.log('not found', i) + // if low > high => we have searched the whole array without finding the item return -1 } } -var ar = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] -binarySearch(ar, 3) -binarySearch(ar, 7) -binarySearch(ar, 13) +/* ---------------------------------- Test ---------------------------------- */ + +const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +const stringArr = [ + 'Alpha', + 'Bravo', + 'Charlie', + 'Delta', + 'Echo', + 'Foxtrot', + 'Golf', + 'Hotel', + 'India', + 'Juliet', + 'Kilo', + 'Lima', + 'Mike', + 'November', + 'Oscar', + 'Papa', + 'Quebec', + 'Romeo', + 'Sierra', + 'Tango', + 'Uniform', + 'Victor', + 'Whiskey', + 'X-Ray', + 'Yankee', + 'Zulu' +] + +console.log(binarySearch(arr, 3)) +console.log(binarySearch(arr, 7)) +console.log(binarySearch(arr, 13)) + +console.log(binarySearch(stringArr, 'Charlie')) +console.log(binarySearch(stringArr, 'Zulu')) +console.log(binarySearch(stringArr, 'Sierra'))