2分查找
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> </body> <script> const arr = [3, 5, 19, 22, 25, 33, 45, 47, 57, 66, 71, 78]; console.log(init(arr, 88)) console.log(init(arr, 66)) console.log(init(arr, 22)) function init(A, x) { let l = 0; let r = A.length - 1; let guess; while (l < r) { guess = Math.floor((l + r) / 2); if (A[guess] === x) return guess else if (A[guess] > x) { r = guess - 1 } else { l = guess + 1 } } return -1 } </script> </html>
1. 我们先声明最左边为 0 ,最右边为传入数组的长度 ,
guess 表示为中间值
let l = 0; let r = A.length - 1; let guess;
2. 做一个判断 当左边右边的时候 程序运行 反之 返回 -1
while (l < r) { } return -1
3. 做判断
(1) 当 A[guess] 这个中间值刚好等于 我们要查找的值时 返回 guess
(2) 当 A[guess] 大于查找的值 时 ,
设置最右边 r 为 r = guess - 1
比如 A[0] 到 A[guess - 1 ] 这期间的所有值
(3) 当 A[guess] 小于查找的值 时 ,
设置最左边 l 为 l = guess + 1
比如 A[guess +1 ] 到 A [length-1 ] 这期间的所有值
guess = Math.floor((l + r) / 2); if (A[guess] === x) return guess else if (A[guess] > x) { r = guess - 1 } else { l = guess + 1 }
越努力越幸运