当前位置: 首页 > ds >正文

JavaScript 中一些常见算法的实现及详细解析

文章目录

    • @[TOC]
      • 1. 排序算法
        • (1) 冒泡排序(Bubble Sort)
        • (2) 快速排序(Quick Sort)
        • (3) 归并排序(Merge Sort)
      • 2. 查找算法
        • (1) 线性查找(Linear Search)
        • (2) 二分查找(Binary Search)
      • 3. 图算法
        • (1) 深度优先搜索(DFS)
        • (2) 广度优先搜索(BFS)
      • 4. 动态规划算法
        • 背包问题(Knapsack Problem)

1. 排序算法

(1) 冒泡排序(Bubble Sort)

原理:
通过重复遍历数组,比较相邻元素并交换位置,使较大的元素逐渐“浮”到数组末尾。

function bubbleSort(arr) {let n = arr.length;for (let i = 0; i < n - 1; i++) {for (let j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];}}}return arr;
}

(2) 快速排序(Quick Sort)

原理:
采用分治法。选择一个基准值,将数组分为小于、等于、大于基准的三部分,递归处理左右两部分。

function quickSort(arr) {if (arr.length <= 1) return arr;const pivot = arr[arr.length - 1];const left = [];const right = [];for (let i = 0; i < arr.length - 1; i++) {arr[i] < pivot ? left.push(arr[i]) : right.push(arr[i]);}return [...quickSort(left), pivot, ...quickSort(right)];
}

(3) 归并排序(Merge Sort)

原理:
将数组一分为二,分别排序后合并两个有序数组。

function mergeSort(arr) {if (arr.length <= 1) return arr;function merge(left, right) {const result = [];let i = 0, j = 0;while (i < left.length && j < right.length) {result.push(left[i] < right[j] ? left[i++] : right[j++]);}return [...result, ...left.slice(i), ...right.slice(j)];}const mid = Math.floor(arr.length / 2);const left = mergeSort(arr.slice(0, mid));const right = mergeSort(arr.slice(mid));return merge(left, right);
}

2. 查找算法

(1) 线性查找(Linear Search)

原理:
逐个遍历数组元素,直到找到目标值或遍历结束。

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

(2) 二分查找(Binary Search)

原理:
适用于已排序数组。每次将搜索范围缩小一半,直到找到目标值或范围为空。

function binarySearch(arr, target) {let low = 0, high = arr.length - 1;while (low <= high) {const mid = Math.floor((low + high) / 2);if (arr[mid] === target) return mid;else if (arr[mid] < target) low = mid + 1;else high = mid - 1;}return -1;
}

3. 图算法

(1) 深度优先搜索(DFS)

原理:
从起点开始,沿着一条路径尽可能深入地探索图中的节点。

function dfs(graph, start, visited = new Set()) {visited.add(start);console.log(start);for (const neighbor of graph[start]) {if (!visited.has(neighbor)) {dfs(graph, neighbor, visited);}}
}

(2) 广度优先搜索(BFS)

原理:
按层遍历图,使用队列实现先进先出的访问顺序。

function bfs(graph, start) {const visited = new Set();const queue = [start];visited.add(start);while (queue.length > 0) {const node = queue.shift();console.log(node);for (const neighbor of graph[node]) {if (!visited.has(neighbor)) {visited.add(neighbor);queue.push(neighbor);}}}
}

4. 动态规划算法

背包问题(Knapsack Problem)

原理:
在容量限制下最大化物品总价值。使用二维 DP 数组 dp[i][w] 表示前 i 个物品、容量为 w 的最大价值。

function knapsack(weights, values, capacity) {const n = values.length;const dp = Array.from({ length: n + 1 }, () => Array(capacity + 1).fill(0));for (let i = 1; i <= n; i++) {for (let w = 0; 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];
}
http://www.xdnf.cn/news/15431.html

相关文章:

  • 详解Linux下多进程与多线程通信(二)
  • Web应用性能优化之数据库查询实战指南
  • 时间的弧线,逻辑的航道——标准单元延迟(cell delay)的根与源
  • 单页面和多页面的区别和优缺点
  • 通用定时器GPT
  • 【Linux学习笔记】认识信号和信号的产生
  • 区块链平台之以太坊深入解读:技术、经济与生态的全面解析
  • 剑指offer57_和为S的两个数字
  • 串口连接工控机
  • 【离线数仓项目】——电商域DIM层开发实战
  • 服务端高效处理拖拽排序
  • 锁相环初探
  • 【6.1.2 漫画分布式事务技术选型】
  • BaseDao 通用更新方法设计与实现
  • 【PMP备考】敏捷思维:驾驭不确定性的项目管理之道
  • Java ThreadLocal详解:从原理到实践
  • 快速过一遍Python基础语法
  • 第34次CCF-CSP认证第4题,货物调度
  • 零基础搭建监控系统:Grafana+InfluxDB 保姆级教程,5分钟可视化服务器性能!​
  • Python 中的 encode() 和 decode() 方法详解
  • JavaSE常用类
  • 开阳630HV100芯片的外设配置
  • 【C++】封装红黑树模拟实现set和map
  • C语言<数据结构-单链表>(收尾)
  • Linux反弹shell的几种方式
  • Java 接口详解:从基础到高级,掌握面向对象设计的核心契约
  • linux系统mysql性能优化
  • 【理念●体系】迁移复现篇:打造可复制、可复原的 AI 项目开发环境
  • AI产品经理面试宝典第12天:AI产品经理的思维与转型路径面试题与答法
  • 车载诊断架构 --- 诊断功能开发流程