应在线性查找适合无序数据或数据量小时使用;二分查找必须要求数组已排序,否则结果不可靠,未排序时只能用linearSearch,否则会漏目标或返回错误索引。

线性查找适合无序数据,二分查找必须要求数组已排序,否则结果不可靠。
什么时候该用 linearSearch 而不是 binarySearch
线性查找不依赖数据顺序,遍历每个元素直到匹配或结束;二分查找每次砍掉一半范围,但前提是数组升序(或严格单调)。
- 数组未排序 → 只能用
linearSearch,强行用binarySearch会漏掉目标或返回错误索引 - 数据量小(比如
- 需查找多次且数组不变 → 先排序再用
binarySearch更划算 - 插入/删除频繁 → 维护有序成本高,线性查找更稳妥
binarySearch 实现时最容易错的三个地方
不是写对逻辑就完事,边界和终止条件稍有偏差就会死循环或越界。
- 右边界初始化写成
arr.length而不是arr.length - 1→ 访问arr[arr.length]得undefined - 循环条件用
left 是对的,但有人误写成left → 漏判单元素区间 - 中点计算写成
(left + right) / 2→ 大数下可能溢出,应改用left + Math.floor((right - left) / 2)
JavaScript 中没有内置 binarySearch,但可以这样安全复用
别每次手写,封装成工具函数并加类型防护更可靠。
立即学习“Java免费学习笔记(深入)”;
function binarySearch(arr, target) {
if (!Array.isArray(arr) || arr.length === 0) return -1;
let left = 0;
let right = arr.length - 1;
while (left <= right) {
const mid = left + Math.floor((right - left) / 2);
if (arr[mid] === target) return mid;
if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
- 调用前不用手动排序 —— 你得自己保证输入已排序,函数不负责校验顺序
- 返回
-1表示未找到,和indexOf语义一致,方便替换旧逻辑 - 如果要支持对象数组,需额外传入比较函数,不能直接用
===
二分查找的“有序”是硬约束,不是建议;而线性查找的慢,往往慢在没意识到——该换数据结构的时候还在优化循环体。











