二分查找
什么是二分查找
二分查找是在一个有序的数组中查找,查找某个值的索引。比如在一个数组 arr 中 查找 target ,找到了返回 target 在arr 中的索引, 没找到返回 -1.
二分查找的思路
- 创建两个变量,一个是数组的开始位置startIndex,一个是数组的结尾位置 endIndex,
- 计算出数组的中间位置 minIndex .
- 用中间位置的值和target 进行比较, 比如是一个升序的数组,那target 大于 中间值, 就把startIndex 设置为minIndex , minIndex 重新计算赋值,再重复比较。直到 找到target = 中间值。
- 如果一直到 startIndex = endIndex 也没有找到相等的值,那就是没找到 返回-1
二分查找的复杂度
由于每次查找到会排除掉数组的一半, 时间复杂度为O(logn)
二分的应用
这种思想应用的非常普遍,在速度上是非常大的优势。 就好比有规则下的排除法。
循环实现二分查找
function binarySearch1 (arr: number[],target: number): number {
const len = arr.length;
if (len===0) return -1;
let startIndex: number = 0;
let endIndex: number = len - 1;
while (startIndex < endIndex) {
const minIndex = Math.floor((startIndex+endIndex)/2)
const minValue = arr[minIndex]
if (target < minValue) {
endIndex = minIndex - 1
} else if (target > minValue) {
startIndex = minIndex + 1
} else {
return minIndex
}
}
return -1
}
递归实现二分查找
function binarySearch2 (arr: number[], target: number, startIndex?: number, endIndex?: number): number {
const len = arr.length;
if (len===0) return -1;
if (!startIndex) {
startIndex = 0
}
if (!endIndex) {
endIndex = len - 1
}
const minIndex = Math.floor((startIndex+endIndex)/2)
const minValue = arr [minIndex]
if (target > minValue) {
return binarySearch2(arr, target, minIndex + 1, endIndex)
}else if (target < minValue) {
return binarySearch2(arr, target, startIndex, endIndex - 1)
}else {
return minIndex
}
}
小结
- 循环和递归的时间复杂度都是O(logn)
- 在有序的情况下,基本上都会用到二分
- 因为每次调用函数都会有额外的开销,所以 循环还是比递归更快些。(较真)
2周刷完100道前端优质面试真题 mu课 视频及资料领取请关注:奋斗的刚子
欢迎访问我的小程序,惊喜不断