算法的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;
}
图算法
Dijkstra算法的实现:
function dijkstra(graph, start) {
const distances = {};
const visited = new Set();
const nodes = Object.keys(graph);
nodes.forEach(node => distances[node] = Infinity);
distances[start] = 0;
while (nodes.length) {
nodes.sort((a, b) => distances[a] - distances[b]);
const closest = nodes.shift();
if (distances[closest] === Infinity) break;
if (visited.has(closest)) continue;
visited.add(closest);
for (let neighbor in graph[closest]) {
const newDistance = distances[closest] + graph[closest][neighbor];
if (newDistance < distances[neighbor]) {
distances[neighbor] = newDistance;
}
}
}
return distances;
}
动态规划
斐波那契数列的优化实现:
function fibonacci(n, memo = {}) {
if (n in memo) return memo[n];
if (n <= 2) return 1;
memo[n] = fibonacci(n - 1, memo) + fibonacci(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(
dp[i - 1][w],
values[i - 1] + dp[i - 1][w - weights[i - 1]]
);
} else {
dp[i][w] = dp[i - 1][w];
}
}
}
return dp[n][capacity];
}
字符串算法
KMP字符串匹配算法:
function buildPrefixTable(pattern) {
const prefixTable = [0];
let prefixLength = 0;
let i = 1;
while (i < pattern.length) {
if (pattern[prefixLength] === pattern[i]) {
prefixLength++;
prefixTable[i] = prefixLength;
i++;
} else {
if (prefixLength !== 0) {
prefixLength = prefixTable[prefixLength - 1];
} else {
prefixTable[i] = 0;
i++;
}
}
}
return prefixTable;
}
function kmpSearch(text, pattern) {
const prefixTable = buildPrefixTable(pattern);
let textIndex = 0;
let patternIndex = 0;
while (textIndex < text.length) {
if (text[textIndex] === pattern[patternIndex]) {
textIndex++;
patternIndex++;
if (patternIndex === pattern.length) {
return textIndex - pattern.length;
}
} else {
if (patternIndex !== 0) {
patternIndex = prefixTable[patternIndex - 1];
} else {
textIndex++;
}
}
}
return -1;
}
树算法
二叉搜索树实现:
class Node {
constructor(value) {
this.value = value;
this.left = null;
this.right = null;
}
}
class BST {
constructor() {
this.root = null;
}
insert(value) {
const newNode = new Node(value);
if (!this.root) {
this.root = newNode;
return this;
}
let current = this.root;
while (true) {
if (value === current.value) return undefined;
if (value < current.value) {
if (!current.left) {
current.left = newNode;
return this;
}
current = current.left;
} else {
if (!current.right) {
current.right = newNode;
return this;
}
current = current.right;
}
}
}
search(value) {
if (!this.root) return false;
let current = this.root;
while (current) {
if (value === current.value) return true;
if (value < current.value) {
current = current.left;
} else {
current = current.right;
}
}
return false;
}
}





