如何在javascript中实现搜索算法_线性与二分查找区别【教程】

12次阅读

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

如何在javascript中实现搜索算法_线性与二分查找区别【教程】

线性查找适合无序数据,二分查找必须要求数组已排序,否则结果不可靠。

什么时候该用 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 语义一致,方便替换旧逻辑
  • 如果要支持对象数组,需额外传入比较函数,不能直接用 ===

二分查找的“有序”是硬约束,不是建议;而线性查找的慢,往往慢在没意识到——该换数据结构的时候还在优化循环体。

text=ZqhQzanResources