二分查找
题目
用 Javascript 实现二分查找(针对有序数组),说明它的时间复杂度
分析
二分查找是一种固定的算法
两种实现思路
- 递归 - 代码逻辑更加简洁
- 循环 - 性能更好(就调用一次函数,而递归需要调用很多次函数,创建函数作用域会消耗时间)
时间复杂度 O(logn)
// 二分查找 循环
function binaryFind1(arr = [], target) {
const length = arr.length;
if (length === 0) return -1;
let startIndex = 0;
let endIndex = length - 1;
while (startIndex <= endIndex) {
const midIndex = Math.floor((startIndex + endIndex) / 2);
const midValue = arr[midIndex];
if (target < midValue) {
// 目标值较小,则继续在左侧查找
endIndex = midIndex - 1;
} else if (target > midIndex) {
// 目标值较大,则继续在右侧查找
startIndex = midIndex + 1;
} else {
return midIndex;
}
}
return -1;
}
// 二分查找 递归
function binaryFind2(arr, target, startIndex, endIndex) {
const length = arr.length;
if (length === 0) return -1;
// 开始和结束的范围
if (startIndex == null) startIndex = 0;
if (endIndex == null) endIndex = length - 1;
// 如果 start 和 end 相遇,则结束
if (startIndex > endIndex) return -1;
const midIndex = Math.floor((startIndex + endIndex) / 2);
const midValue = arr[midIndex];
if (target < midIndex) {
// 目标值较小,则继续在左侧查找
return binaryFind2(arr, target, startIndex, midIndex - 1);
} else if (target > midIndex) {
// 目标值较大,则继续在右侧查找
return binaryFind2(arr, target, midIndex + 1, endIndex);
} else {
return midIndex;
}
return -1;
}