mirror of
https://github.com/TheAlgorithms/JavaScript.git
synced 2025-07-15 02:33:35 +08:00
92 lines
2.5 KiB
JavaScript
92 lines
2.5 KiB
JavaScript
/* 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 binarySearchRecursive (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 binarySearchRecursive(arr, x, low, mid - 1)
|
|
} else {
|
|
// arr[mid] is a lower bound for x, so if x is in arr => mid < x <= high
|
|
return binarySearchRecursive(arr, x, mid + 1, high)
|
|
}
|
|
} else {
|
|
// if low > high => we have searched the whole array without finding the item
|
|
return -1
|
|
}
|
|
}
|
|
function binarySearchIterative (arr, x, low = 0, high = arr.length - 1) {
|
|
while (high >= low) {
|
|
const mid = Math.floor(low + (high - low) / 2)
|
|
|
|
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
|
|
high = mid - 1
|
|
} else {
|
|
// arr[mid] is a lower bound for x, so if x is in arr => mid < x <= high
|
|
low = mid + 1
|
|
}
|
|
}
|
|
// if low > high => we have searched the whole array without finding the item
|
|
return -1
|
|
}
|
|
|
|
export { binarySearchIterative, binarySearchRecursive }
|
|
|
|
/* ---------------------------------- 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'
|
|
// ]
|
|
|
|
// binarySearchRecursive(arr, 3)
|
|
// binarySearchIterative(arr, 7)
|
|
// binarySearchRecursive(arr, 13)
|
|
// binarySearchIterative(stringArr, 'Charlie')
|
|
// binarySearchRecursive(stringArr, 'Zulu')
|
|
// binarySearchIterative(stringArr, 'Sierra')
|