算法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