首页
学习
活动
专区
圈层
工具
发布

前端学习数据结构与算法系列(七):堆排序与归并排序

floor(n/2)和n-1之间 用JS实现堆排序 实现堆排序之前,我们需要先将即将排序的数据构建成一个最大堆,构建完成后,根据最大堆的属性可知,堆顶部的值最大,我们将它取出,然后重新构建堆,直到堆中的所有数据被取出...该操作会一直重复执行,直到所有子序列都归并为一个整体为止。...如图所示,i号元素已经放入数组中,此时我们将i移动到下一个位置,将其与j进行大小比较,将小的一方放进arr数组中,k移动至下一个位置。...如图所示,j号元素已经放入数组中,此时我们将j移动到下一个位置,将其与i进行大小比较,将小的一方放进arr数组中,k移动至下一个位置。...i指向左侧数组的每一项 j指向右侧数组的每一项 k指向合并后的数组的每一项 声明3个变量:i, j, k 将左侧数组的每一项数据与右侧数组的每一项数据进行大小比较 判断左、右数组是否比较完成 接下来,我们将上述思路用代码实现

95210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    javascript数组去重的N种方法

    上一篇文章笔者演示了javascript如何将多为数组拍平成一维数组,今天给大家演示一下javascript对数组去重的几种方法,数组去重在数据处理的时候是经常碰到的。 那什么是数组去重呢?..., 6, 7 ] 以上便是数组去重,那么如何运用javascript对数组去重呢?...,首先循环遍历数组中每一项,然后用每一项和当前项后面的数组元素比对,相同的话,将其从数组中删除,依次循环完成,达到去重目的。...,循环数组每一项,用空数组的indexOf方法检验每一项,如果不存在将其推入数组,循环完成后,返回新数组。...,然后循环数组,循环过程中,将数组的每一项作为对象的属性进行判断赋值。

    93830

    盘点JavaScript中数组遍历的全部方式(上篇)

    前言 JavaScript想必大家都不陌生了,其中的字符串和数组大家经常都会用到,今天就让我们来说说这里面的数组对象的遍历吧,因为遍历经常使用的缘故,所以小编带着大家来解锁遍历的所有方法,以便大家能够更深入的了解数组遍历...二、Every every()是对数组中的每一项运行给定函数,如果该函数对每一项返回True,则返回True。比如: ? ? 我们给它一个真的条件,如下: ?...三、For循环 最常用的数组遍历的方法,但是效率不够高,一般建议使用临时变量来存储数组中的数据进行遍历读取输出,避免重复。如下: ? 四、For...in.......用于对数组或者对象的属性进行循环操作,每执行一次,就会对数组的元素或者对象的属性进行一次操作,如下: ? 可以看出返回的是数组的下标和数组的值和原型上的方法和属性。...六、Foreach 它可以遍历数组中的每一项,没有返回值,对原数组无影响,而且不止IE浏览器。如下: ?

    1K10

    【基础算法】递归算法

    无论是递归算法还是递归函数,最大的特点都是“自己调用自己”。 斐波那契数列 斐波那契数列的规律是:第一项是1,第二项是1,以后每一项都等于前两项之和。我们的问题是:斐波那契数列的第n项是多少?...使用循环取出当前数组的每一个元素,添加到临时结果数组中: 每次递归调用只修改原数组中的一个数据,在调用完perm()后需要将数组恢复到迭代前的状态。...通常使用do...while结构,如果直接使用while,循环代码块内会丢失默认的排序情况。 无论循环代码块内执行什么操作,退出循环之后,容器会恢复到进入循环之前的状态。...提示:可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。 问:如何移?最少要移动多少次? ---- 题目分析 梵塔问题只能用递归算法来解决。...完成这三步就可以将A针上的64个圆盘全部移到C针上,而且在移动过程中始终保持大盘在下小盘在上的顺序。关键在于第1步和第3步如何执行。

    47910

    移除元素、合并两个有序数组【LeetCode刷题日志】

    思路:把每一个数组中的元素与val比较,比较后若元素等于val,则创建一个新的数组,新的数组中删除了这个元素,其他所有元素都往前移一位,此时生成的数组大小为O(n-1)。...思路二: 以空间换时间 思路三: while(src使用一个 while 循环来遍历数组。循环的条件是 src 必须小于 numsSize,以确保不会越界。...这样,所有不等于 val 的元素都会被移动到数组的前部。 src++;增加 src 的值以移动到数组的下一个元素。...比较和合并:然后,我们进入一个循环,该循环会持续进行,直到end1或end2小于0(也就是说,直到一个数组的所有元素都被合并到另一个数组中)。...这样做的目的是确保我们在每次迭代中都将正确的值放在正确的位置,并保持数组的有序性。 处理剩余元素:在第二步完成后,我们可能会发现nums2中还有一些元素没有被合并到nums1中。

    17210

    【优选算法篇】从蒙特卡洛到模拟退火:探秘模拟算法的不同面貌(下篇)

    生成报数序列: 从第2项开始,依次通过描述前一项来生成下一项。 对于每一项,将连续的相同字符分组,描述这些字符的个数和字符值,生成新的字符串。...首先定义递归函数 generate(n),它的任务是根据输入的 n 返回第 n 项。可以通过递归的方式,逐步向下计算,直到计算到第1项为止。 核心思想: 对于每一项,递归地计算上一项的描述。...最终判断: 在遍历完成之后,我们检查 hash 数组。如果 hash[i] 中有未被处理完的青蛙(例如,'c' 还没有完全发音),则返回 -1。...遍历字符串: 我们遍历输入的字符串 croakOfFrogs,对于每个字符执行以下操作: 遇到 'c':如果当前有未完成的 'k',即之前的“croak”已经完成,减少 'k' 的数量,然后新增一个...通过统计每个字符出现的次数,确保它们能按正确顺序发音。 核心思路: 使用一个 hash 数组记录每个字符的数量,分别是 'c'、'r'、'o'、'a'、'k' 的计数。

    17010

    前端学数据结构与算法(三):链表为什么能和数组相提并论?用链表实现数组bettle下

    也许有一天实际的开发中,遇到某些场景,在我们习惯性的使用数组时,可以停下来思考几秒,也许这个场景用链表更合适(然后还是用数组)。 什么是链表?...,会改变head的指向 while(index > 1) { // 因为是找到之前的节点,所以少遍历一位 prev = prev.next // 从头依次遍历下一个节点...forEach:遍历链表每一项。 map:遍历链表每一项,返回新结果组成的链表。 concat:拼接多个链表为一个链表。 reverse:链表翻转。 sort:排序链表。...} this.size++; } forEach(fn) { // 遍历每一项,没有返回值 if (this.size === 0 || typeof fn !...便利性 链表JavaScript还没有官方的数据结构提供,很多操作需要自己实现,无疑是麻烦很多;而数组官方的API一大箩筐,使用方便,如果数据量不大,完全使用数组也是没任何影响。

    46800

    用例子理解递归

    0.什么是递归       在说什么是递归之前,我想正在阅读的你应该会使用循环来解决一些问题了。那循环又是什么呢?循环是指在程序中需要反复执行某个功能而设置的一种程序结构。...它由循环体中的条件,判断继续执行某个功能还是退出循环。       例如:1+2+3+4+……+10等于多少?(我们排除数学公式) 第一种解决方法就是可以使用循环来解决。 ?...第二种解决方法就是使用递归来解决。 ?       可以看到,循环是反复执行某一段区域内的代码,直到符合终止条件,如果不加控制,就会形成死循环。...而递归是函数体中调用自己,在使用递归的同时,一定要注意结束条件,如果不加控制,将无休止的调用自己,直到堆栈溢回出,因为函数每调用一次就会在栈上创建一个栈帧,函数调用结束后就会弹出该栈帧,而栈的大小不是无限的...这个数列从第3项开始,每一项都等于前两项之和,这个也是在递归中常说的一道题。 第一步: 明确这个递归函数的作用,这个函数的作用是什么?就是输出第n项的值。

    1.2K10

    【Webpack】632- 了不起的 Webpack 构建流程学习

    注意:在构建生命周期中有一系列插件在做合适的时机做合适事情,比如 UglifyPlugin 会在 loader 转换递归完对结果使用 UglifyJs 压缩覆盖之前的结果。...,接着遍历依赖图谱 queue 每一项,再遍历将每一项中的依赖 dependencies 依赖数组,将依赖中的每一项拼接成依赖的绝对路径(absolutePath ),作为 createAssets()...4.1 读取所有模块信息 我们首先声明一个变量 modules,值为字符串类型,然后对参数 graph 进行遍历,将每一项中的 id 属性作为 key ,值为一个数组,包括一个用来执行代码 code 的方法和序列化后的...modules 中每一项的值中,下标为 0 的元素是个函数,接收三个参数 require / module / exports ,为什么会需要这三个参数呢?...在这个自执行函数中,实现了 require 方法,接收一个 id 作为参数,在方法内部,分别实现了 localRequire / module / modules.exports 三个方法,并作为参数,

    1.1K20

    「数据结构与算法Javascript描述」十大排序算法

    你可以看到 72 是如何从数组的开头移动到中间的,还有 2 是如何从数组的后半部分移动到开头的。...然后,内循环将从第一位迭代至倒数第二位,内循环实际上进行当前项和下一项的比较。如果这两项顺序不对(当前项比下一项大),则交换它们,意思是位置为j+1的值将会被换置到位置j处,反之亦然。...外循环从数组的第一个元素移动到倒数第二个元素;内循环从第二个数组元素移动到最后一个元素,查找比当前外循环所指向的元素小的元素。每次内循环迭代后,数组中最小的值都会被赋值到合适的位置。...然而,在 JavaScript 中这种方式不太可行,因为这个算法的递归深度对它来讲太深了。所以,我们将使用一种非递归的方式来实现这个算法,这种策略称为自底向上的归并排序。...算法的步骤如下: 找出待排序的数组中最大和最小的元素 统计数组中每个值为i的元素出现的次数,存入数组C的第i项 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加) 反向填充目标数组:将每个元素

    1.1K20

    盘点JavaScript中数组遍历的全部方式(上篇)

    前言 JavaScript想必大家都不陌生了,其中的字符串和数组大家经常都会用到,今天就让我们来说说这里面的数组对象的遍历吧,因为遍历经常使用的缘故,所以小编带着大家来解锁遍历的所有方法,以便大家能够更深入的了解数组遍历...二、Every every()是对数组中的每一项运行给定函数,如果该函数对每一项返回True,则返回True。...比如: 我们给它一个真的条件,如下: 三、For循环 最常用的数组遍历的方法,但是效率不够高,一般建议使用临时变量来存储数组中的数据进行遍历读取输出,避免重复。...用于对数组或者对象的属性进行循环操作,每执行一次,就会对数组的元素或者对象的属性进行一次操作,如下: 可以看出返回的是数组的下标和数组的值和原型上的方法和属性。...五、For...of 可直接遍历数组的元素的值,对于遍历数组来说非常方便,推荐使用这种方法,如下: 六、Foreach 它可以遍历数组中的每一项,没有返回值,对原数组无影响,而且不止IE浏览器。

    1.1K20

    怒肝 JavaScript 数据结构 — 数组篇(二)

    上一篇我们认识了数据结构中的数组,并且总结了 JavaScript 中数组的基本操作,包括初始化数组,添加,修改,删除数组项等,还总结了 JavaScript 内置的数组操作函数。...如果我们想连续对每个数组项执行一些操作,那么就会用到数组的迭代,也叫遍历,for 循环是最基础的遍历。...-北京', '中国-上海', '中国-杭州', '中国-深圳'] forEach 的参数是一个回调函数,有两个参数,第一个参数 item 表示当前数组项,第二个参数表示索引,遍历的每一项都会执行这个函数...forEach 是直接遍历,纯粹的执行回调函数。而 map 是在回调函数中返回新值,最终在执行完毕后返回新的数组。...,第一个参数 total 是已经累加的总和,第二个参数 item 才是当前数组项,累加直到循环结束,算出最终值。

    1.1K41

    javascript中的生成器和迭代器是什么

    通过使用迭代器,我们可以对集合中的元素进行循环处理,每次处理一个元素,直到处理完整个集合为止。...在函数体内部,使用了while(true)循环来生成数列中的每一项。在每次循环中,更新prev和curr变量的值,然后使用yield语句返回当前项的值。这个函数可以无限地生成数列,因为它没有终止条件。...在调用fibonacci函数之后,将返回一个迭代器对象fib。我们可以使用next()方法来逐一获取数列中的每一项,并将其打印出来。...在第一次调用fib.next().value时,会执行fibonacci函数中的代码,生成数列中的第一项(值为1),然后暂停函数的执行,并将该值返回给调用方。...通过使用迭代器,我们可以遍历该数列的前 10 项。实现异步编程在 JavaScript 中,生成器可以用来实现异步编程,从而避免回调地狱。

    21210

    js中基础数据结构数组去重问题

    ()方法都具有一个遍历作用,但是它们在遍历的同时还具有其特定的功能,以上这几个方法是我在处理数组数据时常用的方法,之前没有使用过或者使用不全的同学可以去搜索一下它们各自的功能 二.数组去重 思考?...如何去除数组中重复的项 例如数组:[1,3,4,3,5]我们在做去重的时候,一开始想到的肯定是,逐个比较,外面一层循环,内层后一个与前一个一比较,如果是久不将当前这一项放进新的数组,挨个比较完之后返回一个新的去过重复的数组...成功输出去重后的数组 既然数组的方法都已经如此完善了,岂不是有更好的遍历方法 ? 使用forEach替代for循环 最后!...如果数组中重复出现的并不是简单的数据类型,每一项都是一种复杂的对象类型的数据结构该如何去重呢? 例如数组是这样的: ?...附上小方法 解析:上面这个方法呢利用Object.keys()这个方法枚举我们去重后的一个对象unique,这个方法返回一个属性列表数组,之后我们利用数组的map()方法遍历并且给每一项执行一个callback

    1.1K20

    Javascript数组方法(ES5-ES6)

    在排序时,sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。...cv的第4项是一个包含两项的数组,也就是说concat方法只能将传入数组中的每一项添加到数组中,如果传入数组中有些项是数组,那么也会把这一数组项当作一项添加到cv中。...这两个方法都返回要查找的项在数组中的位置,或者在没找到的情况下返回-1,在比较第一个参数与书中的每一项时,会使用全等操作符。...参数function类型,默认有传参,参数分别为:遍历的数组内容,对应的数组索引,数组本身。...函数,执行后返回的是一个遍历器对象,对这个遍历器对象执行扩展运算符,就会将内部遍历得到的值,转为一个数组。

    1.1K10

    在JavaScript中的数据结构(链表)

    然而,在大多数语言中这种数据结构有一个缺点:数组的大小是固定的,从数组的起点或中间插入或移除项的成本很高,因为需要移动元素。...链表可以灵活地插入、删除节点,不需要像数组一样进行扩容或拷贝操作。然而,链表的缺点是访问链表中的特定元素的时间复杂度较高,需要从头开始遍历链表直到找到目标节点。...---- 详细的看一下列表 在JavaScript中,可以使用对象来实现链表。每个节点被表示为一个包含数据和指针属性的对象,通过这些对象之间的引用来构建链表结构。...'n' : '');//用current来检查元素是否存在 //如果列表为空,或是到达列表中最后一个元素的下一位(null),while循环中的代码就不会执行 //得到了元素的内容,将其拼接到字符串中...这样,可以在需要的时候方便地进行双向遍历。 在这里插入图片描述 ---- 循环链表 循环链表可以像链表一样只有单向引用,也可以像双向链表一样有双向引用。

    61110

    如何在JavaScript中使用for循环

    为什么使用for循环 在JavaScript中,就像在其他编程语言中一样,我们使用循环来读取或访问集合中的项。这个集合可以是一个数组或一个对象。...它可以是对象、数组、字符串等等。key会是value每一项的键,在每次迭代中都会改变到列表中的下一个键。 注意,这里我们使用let或const来声明key。...举例来说,如果你有一个包含四项的数组,你在索引3的位置插入了一项,在现代浏览器中,for...in循环仍然会按照从0到4的顺序遍历数组。...在IE中,当使用for...in循环时,它将遍历一开始就在数组中的四个项目,然后再遍历在索引3的位置添加的那一项。 迭代时进行更改 对属性的任何添加、删除或修改都不能保证有序的迭代。...for循环的替代方案 forEach在JavaScript中是数组原型的一个方法,它允许我们在回调函数中遍历数组的元素和它们的索引。

    5.9K10
    领券