用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();
Object.keys(graph).forEach(node => distances[node] = Infinity);
distances[start] = 0;
while (true) {
let current = null;
for (const node in distances) {
if (!visited.has(node) && (current === null || distances[node] < distances[current])) {
current = node;
}
}
if (current === null) break;
for (const [neighbor, weight] of Object.entries(graph[current])) {
const newDistance = distances[current] + weight;
if (newDistance < distances[neighbor]) distances[neighbor] = newDistance;
}
visited.add(current);
}
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];
}
加密算法
SHA-256哈希(使用Web API)
async function sha256(message) {
const msgBuffer = new TextEncoder().encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('');
}
注意事项
- 性能敏感场景应考虑算法时间复杂度,如排序大规模数据时优先选择O(n log n)算法
- 加密相关操作应使用浏览器或Node.js内置加密API而非自行实现
- 图算法实现时需注意处理循环引用和无限递归情况
- 动态规划问题通常需要建立备忘录优化重复计算
完整实现所有算法需要参考《算法导论》等专业资料,上述示例提供了常见算法的JavaScript实现范式。实际开发中建议优先使用经过验证的库(如lodash、crypto-js等)而非重复造轮子。







