
JavaScript 数据结构与算法
整理和介绍关于前端的数据结构与算法,JavaScript版
火星飞鸟
学习前端ing...
展开
-
JavaScript 数组头部、尾部进行增删元素
pop()方法将删除数组的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。例如,删除数组尾部的元素:push()方法可向数组的末尾添加一个或多个元素,并返回新的长度。例如,数组尾部添加元素:unshift()方法可向数组的开头添加一个或更多元素,并返回新的长度。例如,数组头部添加元素:shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。例如,删除数组头部的元素:注意:以上方法都会修改原数组。const arr = [1, 2, 3..原创 2021-04-14 10:45:52 · 1548 阅读 · 0 评论 -
JavaScript 实现二分搜索
思路从数组的中间元素开始,如果中间元素正好是目标值,则搜索结束。如果目标值大于或小于中间元素,则在大于或小于中间元素的那一半数组中二分搜索。二分搜索前提:数组有序时间复杂度:O(logN)实现现有有序数组[3, 4, 5, 6, 7, 9, 12, 15],进行二分搜索12:Array.prototype.binarySearch = function(item) { let low = 0; let high = this.length - 1; while (l原创 2021-03-19 09:45:17 · 205 阅读 · 0 评论 -
JavaScript 实现顺序搜索
思路遍历数组找到跟目标元素,返回它的下标遍历结束后,若没有找到目标值,返回-1时间复杂度:O(n)实现现有数组[7, 5, 4, 15, 3, 9, 6, 12],进行顺序搜索3:Array.prototype.sequentialSearch = function(item) { for (let i = 0; i < this.length; i++) { if (this[i] === item) return i; } return -原创 2021-03-18 10:22:08 · 220 阅读 · 0 评论 -
JavaScript 实现快速排序
思路以升序排序为例:分区从数组中任意选择一个元素作为基准,所有比基准小的元素放在基准前面,比基准大的元素放在基准后面。递归递归地对基准前后的子数组进行分区操作升序快速排序动画演示如图所示:时间复杂度:O(nlogN)实现现有数组[7, 5, 4, 15, 3, 9, 6, 12],进行升序排序:Array.prototype.quickSort = function() { const rec = arr => { if (arr.length <原创 2021-03-18 10:10:14 · 285 阅读 · 2 评论 -
JavaScript 实现归并排序
思路以升序排序为例:归把数组分成两半,再递归地对子数组进行“分”操作,直到分成一个个单独的数并把两个数合并为有序数组,再对有序数组进行合并,直到全部子数组合并为一个完整数组合并有序数组的操作:新建一个空数组res,用于存放最终排序后的数组比较连个有序数组的头部,较小者出队并推入res中如果两个数组还有值,重复第二步升序归并排序动画演示如图所示:时间复杂度:O(nlogn)实现现有数组7, 5, 15, 4, 9, 3, 12, 6],进行升序排序:Array.p原创 2021-03-17 15:20:52 · 300 阅读 · 1 评论 -
JavaScript 实现插入排序
思路以升序排序为例:从第二个数开始往前比较比前面的数小就继续往前比较在合适的位置插入该元素第三个数开始往前比较以此类推,进行到最后一个数升序插入排序动画演示如图所示:时间复杂度:O(n2)实现现有数组[7, 5, 4, 15, 3, 9, 6, 12],进行升序排序:Array.prototype.insertionSort = function() { // 第一个数默认已经排序 // 从第二个数开始,遍历没有排序过的数 for (let i = 1;原创 2021-03-17 15:19:46 · 344 阅读 · 2 评论 -
JavaScript 实现选择排序
思路以升序排序为例:找到数组中的最小值,将其放置在数组第一位找到数组中第二小的值,将其放置在数组第二位以此类推,执行n-1轮就可以完成排序升序选择排序动画演示如图所示:时间复杂度:O(n2)实现现有数组[7, 5, 4, 15, 3, 9, 6, 12],进行升序排序:Array.prototype.selectionSort = function() { // 重复(元素个数-1)次 for (let i = 0; i < this.length - 1; i原创 2021-03-16 13:01:34 · 304 阅读 · 0 评论 -
JavaScript 实现冒泡排序
思路以升序排序为例:依次比较所有相邻元素,如果第一个比第二个大,则交换他们一轮下来可以保证最后一个数是最大的执行n-1轮就可以完成排序升序冒泡排序动画演示如图所示:时间复杂度:O(n2)实现现有数组[7, 5, 4, 15, 3, 9, 6, 12],进行升序排序:Array.prototype.bubbleSort = function() { // 重复(元素个数-1)次 for (let i = 0; i < this.length - 1; i++) {原创 2021-03-16 13:00:24 · 305 阅读 · 0 评论 -
JavaScript 数据结构——堆
概念堆是一种特殊的完全二叉树。它的所有节点都大于等于或小于等于它的子节点。最大堆:所有节点都大于等于它的子节点最小堆:所有节点都小于等于它的子节点实现JavaScript中通常用数组表示堆,如下图堆,可用数组表示:即按照广度优先遍历的顺序依次填入到数组中。另外,节点位置与数组的下标index有如下关系:任意节点的左侧子节点(若存在)的位置:2 × index + 1任意节点的右侧子节点(若存在)的位置:2 × index + 2任意节点的父节点的位置:( inde原创 2021-03-16 09:13:08 · 746 阅读 · 0 评论 -
JavaScript 数据结构——图
概念图是网络结构的抽象模型,是一组由边连接的节点。实现JavaScript中没有图,但可用Object和Array构建图。邻接矩阵上述图可用邻接矩阵表示为:邻接表上述图可用邻接表表示为:const graph = { A: ["B"], B: ["C", "D"], C: ["E"], D: ["A"], E: ["D"],}遍历有如下图,起点为节点2:// start:2const graph = { 0: [1, 2],原创 2021-03-14 13:38:47 · 281 阅读 · 0 评论 -
JavaScript 数据结构——二叉树
概念二叉树是树中每个节点最多只能有两个子节点的树。实现在JavaScript中常用Object来实现二叉树,如上图二叉树可表示为:const bt = { val: 1, left: { val: 2, left: { val: 4, left: null, right: null }, right: { val: 5,原创 2021-03-14 10:22:40 · 1754 阅读 · 3 评论 -
JavaScript 数据结构——树
概念树是一种分层数据的抽象模型。树的常用操作:深度优先遍历广度优先遍历实现JavaScript中没有树,但是可用Object和Array来构建树。深度优先遍历尽可能深地搜索树的分支。步骤:访问根节点对根节点的子节点依次进行深度优先遍历如上图所示,深度优先遍历这棵树,访问顺序为A - B - D - E -C - F - G。JavaScript实现:const tree = { val: 'A', children: [{ val: 'B原创 2021-03-13 20:11:15 · 426 阅读 · 0 评论 -
JavaScript 数据结构——字典
概念字典也是一种存储唯一值的数据结构,但它是以键值对的形式来存储。字典的常用操作:增、删、改、查。实现JavaScript中可用Map()表示字典:const m = new Map();// 增m.set('a', 'aaa');m.set('b', 'bbb');m.set('c', 'ccc');// Map(3) { 'a' => 'aaa', 'b' => 'bbb', 'c' => 'ccc' }// 删m.delete('b');// Map(2原创 2021-03-13 20:10:05 · 398 阅读 · 0 评论 -
JavaScript 数据结构——集合
概念集合是一种无序且唯一的数据结构。无序:没有先后顺序,不关心顺序唯一:集合中的元素不允许有重复实现JavaScript可用Set()表示集合:const arr = [1, 2, 2, 3, 3, 3];// 利用集合进行数组去重const arr2 = [...new Set(arr)];console.log(arr2); // [ 1, 2, 3 ]// 判断元素是否在集合中const set = new Set(arr);console.log(set.has(1)原创 2021-03-13 20:09:27 · 281 阅读 · 0 评论 -
JavaScript 数据结构——链表
概念链表是多个元素组成的列表,元素存储不连续, 用next指针连在一起。实现在JavaScript中可以用Object模拟链表:const a = { val: 'a' };const b = { val: 'b' };const c = { val: 'c' };const d = { val: 'd' };a.next = b;b.next = c;c.next = d;// 遍历链表let p = a; // 声明指针 指向链表头部while (p) { cons原创 2021-03-13 20:08:47 · 190 阅读 · 0 评论 -
JavaScript 数据结构——队列
概念队列是一个线性结构,特点是先进先出。入队push():出队shift():实现class Queue { constructor() { this.queue = [] } push(item) { // 入队 this.queue.push(item) } shift() { // 出队 return this.queue.shift() } getH原创 2021-03-13 20:07:28 · 203 阅读 · 0 评论 -
JavaScript 数据结构——栈
概念栈是一种线性结构,最大的特点就是先进后出,后进先出。入栈push():出栈pop():实现JavaScript中可以用数组表示栈:class Stack { constructor() { this.stack = []; } push(item) { // 入栈 this.stack.push(item) } pop() { // 出栈 this.stack.pop原创 2021-03-13 20:05:27 · 295 阅读 · 0 评论 -
JavaScript使用递归遍历json所有节点值
深度优先遍历一个json对象中所有的节点值,并打印出路径。实现代码const json = { a: { b: { c: 1, d: 2, }, }, e: [3, 4],};// 深度优先遍历const dfs = (n, path) => { console.log(n, path); // 获取所有的子节点,并遍历 Object.keys(n).forEac原创 2021-02-26 14:01:44 · 1058 阅读 · 0 评论