二分查找法
二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法。算法思想是不断的缩小查找范围:
- 以数组的中间元素做为分割点,假设变量名为middle;
- 如果要查找的元素比arr[middle]大,则在middle的右半边查找,否则在middle的左半边查找;
- 重复上面的两步
相比普通的顺序查找,除了数据量很少的情况下,二分查找会比顺序查找更快,区别如下所示:
代码实现:
function BinarySearch(arr, target) { if (arr.length <= 1) return -1 // 低位下标 let lowIndex = 0 // 高位下标 let highIndex = arr.length - 1 while (lowIndex <= highIndex) { // 中间下标 const midIndex = Math.floor((lowIndex + highIndex) / 2) if (target < arr[midIndex]) { highIndex = midIndex - 1 } else if (target > arr[midIndex]) { lowIndex = midIndex + 1 } else { // target === arr[midIndex] return midIndex } } return -1 }
递归版本:
function binarySearch(arr,l,r,target){ if(l> r){ return -1; } let mid = l + Math.floor((r-l)/2) if(arr[mid] === target){ return mid; }else if(arr[mid] < target ){ return binarySearch(arr,mid + 1,r,target) }else{ return binarySearch(arr,l,mid - 1,target) } }
如果数组中存在重复项,而我们需要找出第一个指定的值,实现则如下:
function BinarySearchFirst(arr, target) { if (arr.length <= 1) return -1 // 低位下标 let lowIndex = 0 // 高位下标 let highIndex = arr.length - 1 while (lowIndex <= highIndex) { // 中间下标 const midIndex = Math.floor((lowIndex + highIndex) / 2) if (target < arr[midIndex]) { highIndex = midIndex - 1 } else if (target > arr[midIndex]) { lowIndex = midIndex + 1 } else { // 当 target 与 arr[midIndex] 相等的时候,如果 midIndex 为0或者前一个数比 target 小那么就找到了第一个等于给定值的元素,直接返回 if (midIndex === 0 || arr[midIndex - 1] < target) return midIndex // 否则高位下标为中间下标减1,继续查找 highIndex = midIndex - 1 } } return -1 }