SorryToPerson logo
返回
算法2026-04-15·6 分钟

算法知识库:搜索算法实现

二分搜索、线性搜索和相关变体的 JavaScript/TypeScript 实现。

搜索算法实现

1. 二分搜索

时间复杂度: O(log n) 空间复杂度: O(1)

ts
function binarySearch(arr: number[], target: number): number {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) return mid;
    if (arr[mid] < target) left = mid + 1;
    else right = mid - 1;
  }

  return -1;
}

2. 递归二分搜索

ts
function binarySearchRecursive(arr: number[], target: number, left = 0, right = arr.length - 1): number {
  if (left > right) return -1;
  const mid = Math.floor((left + right) / 2);
  if (arr[mid] === target) return mid;
  if (arr[mid] < target) return binarySearchRecursive(arr, target, mid + 1, right);
  return binarySearchRecursive(arr, target, left, mid - 1);
}

3. 线性搜索

ts
function linearSearch(arr: number[], target: number): number {
  for (let i = 0; i < arr.length; i += 1) {
    if (arr[i] === target) return i;
  }
  return -1;
}

4. 查找第一个/最后一个位置

ts
function findFirst(arr: number[], target: number): number {
  let left = 0;
  let right = arr.length - 1;
  let result = -1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) {
      result = mid;
      right = mid - 1;
    } else if (arr[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }

  return result;
}

function findLast(arr: number[], target: number): number {
  let left = 0;
  let right = arr.length - 1;
  let result = -1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) {
      result = mid;
      left = mid + 1;
    } else if (arr[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }

  return result;
}

5. 实现要点

  • 二分搜索要求数组有序。
  • 递归版本可能受栈深度限制。
  • 查找边界时需调整指针移动逻辑。
算法搜索JavaScript