js算法实现
以下是JavaScript中常见的算法实现示例,涵盖排序、搜索、递归等经典场景:
排序算法
快速排序
function quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[0];
const left = [];
const right = [];
for (let i = 1; i < arr.length; i++) {
arr[i] < pivot ? left.push(arr[i]) : right.push(arr[i]);
}
return [...quickSort(left), pivot, ...quickSort(right)];
}
归并排序
function mergeSort(arr) {
if (arr.length <= 1) return arr;
const mid = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
return merge(left, right);
}
function merge(left, right) {
let result = [];
while (left.length && right.length) {
left[0] < right[0] ? result.push(left.shift()) : result.push(right.shift());
}
return [...result, ...left, ...right];
}
搜索算法
二分查找
function binarySearch(arr, target) {
let left = 0;
let right = arr.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] === target) return mid;
arr[mid] < target ? left = mid + 1 : right = mid - 1;
}
return -1;
}
递归算法
斐波那契数列
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// 优化版(记忆化)
function fibonacciMemo(n, memo = {}) {
if (n in memo) return memo[n];
if (n <= 1) return n;
memo[n] = fibonacciMemo(n - 1, memo) + fibonacciMemo(n - 2, memo);
return memo[n];
}
动态规划
背包问题
function knapsack(values, weights, capacity) {
const n = values.length;
const dp = Array(n + 1).fill().map(() => Array(capacity + 1).fill(0));
for (let i = 1; i <= n; i++) {
for (let w = 1; w <= capacity; w++) {
if (weights[i - 1] <= w) {
dp[i][w] = Math.max(
values[i - 1] + dp[i - 1][w - weights[i - 1]],
dp[i - 1][w]
);
} else {
dp[i][w] = dp[i - 1][w];
}
}
}
return dp[n][capacity];
}
字符串算法
KMP模式匹配
function buildPrefixTable(pattern) {
const prefix = [0];
let len = 0;
let i = 1;
while (i < pattern.length) {
if (pattern[i] === pattern[len]) {
len++;
prefix[i] = len;
i++;
} else {
if (len !== 0) len = prefix[len - 1];
else prefix[i] = len, i++;
}
}
return prefix;
}
function kmpSearch(text, pattern) {
const prefixTable = buildPrefixTable(pattern);
let i = 0, j = 0;
while (i < text.length) {
if (text[i] === pattern[j]) {
i++, j++;
if (j === pattern.length) return i - j;
} else {
j > 0 ? j = prefixTable[j - 1] : i++;
}
}
return -1;
}
数据结构算法
二叉树遍历
class TreeNode {
constructor(val) {
this.val = val;
this.left = this.right = null;
}
}
// 前序遍历
function preorder(root) {
if (!root) return;
console.log(root.val);
preorder(root.left);
preorder(root.right);
}
// 中序遍历
function inorder(root) {
if (!root) return;
inorder(root.left);
console.log(root.val);
inorder(root.right);
}
这些实现可根据具体需求进行优化,例如添加边界条件检查或性能改进。实际应用中建议结合具体场景选择合适的算法。







