精华内容
下载资源
问答
  • 主要介绍了javascript实现图片相似度算法,大家参考使用吧
  • 主要介绍了JavaScript数据结构和算法图算法,本文讲解了有向、无序、简单的遍历等内容,需要的朋友可以参考下
  • javascript轮播图算法

    2020-10-21 06:53:34
    主要为大家详细介绍了javascript轮播图算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • :搜索JavaScript算法 :waning_gibbous_moon: 合并中 :JavaScript合并 :shortcake: 分区 :JavaScript的分区算法 :JavaScript的数组拆分算法 :backhand_index_pointing_down: 选拔 aureooms / js-selection...
  • :搜索JavaScript算法 :JavaScript的分区算法 :JavaScript的数组拆分算法 :input_symbols: 弦乐 :JavaScript的字符序列代码块 :JavaScript的自然语言处理代码块 :triangular_ruler: 计算几何 :...
  • js js DES 算法

    2021-04-20 17:00:15
    js_DES算法! 很值得下载看看!资源免费,大家分享!! js_DES算法! 很值得下载看看!资源免费,大家分享!!
  • js排序算法动态展示

    2019-03-18 17:39:07
    js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js排序算法动态显示js...
  • JavaScript算法

    2012-03-21 08:49:09
    JavaScript算法
  • 算法JS学习 :sparkles: 使用JavaScript算法解决方案 :sparkles:
  • 主要介绍了JavaScript实现的拼图算法,结合实例形式分析了javascript图形拼接与判定算法相关操作技巧及注意事项,需要的朋友可以参考下
  • Javascript Diff算法 由John Resig( )由Chu Alan“ sprite”修改 根据MIT许可证发布。 更多信息:
  • 创建包含您的名字和姓氏的函数(app1.js)。 EX: myFunc("johny","alba"); output = johny alba 创建将摄氏C°转换为华氏F°的函数(app2.js)。 EX: myFunc(30); output = 86 F° 编写一个函数来检查数字是否为3...
  • JS_algorithm 用JavaScript算法 点点滴滴,积少成多
  • jsdiff 概述 用于逐字比较文本的 diff 算法Javascript 实现。 文档 diff_words(old, new):逐字比较两个文本块,使用 html del和ins标签呈现输出。
  • JS排序算法

    2018-12-29 14:41:24
  • js压缩算法

    2013-01-20 22:37:59
    对静态图片压缩 js压缩算法
  • leetcode卡 leetcode-js JavaScript算法练习 目录 简单算法 字符串 计数二进制子串 数组 正则 排序 数据结构 栈 队列 链表 矩阵 二叉树 堆
  • javascript基本算法汇总

    2020-10-22 17:47:26
    主要为大家详细介绍了javascript基本算法,包括输出奇偶数控制算法、冒泡排序等,感兴趣的小伙伴们可以参考一下
  • 冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经...

    一、冒泡排序

    1、Explanation And Steps(解释的步骤)

    冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

    作为最简单的排序算法之一,冒泡排序给我的感觉就像 Abandon 在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。

    • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

    • 针对所有的元素重复以上的步骤,除了最后一个。

    • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    2、Illustration(图解)

    在这里插入图片描述

    3、Productive(效率)

    正序时最快,反序时最慢

    4、Code(代码)

    function bubbleSort(arr) {
        var len = arr.length;
        for (var i = 0; i < len - 1; i++) {
            for (var j = 0; j < len - 1 - i; j++) {
                if (arr[j] > arr[j+1]) {        // 相邻元素两两对比
                    var temp = arr[j+1];        // 元素交换
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }
    

    JavaScript排序专栏
    14/100
    保存草稿
    发布文章
    SmallTeddy

    二、基数排序

    1、Explanation And Steps(解释的步骤)

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

    基数排序有两种方法:

    这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异案例看大家发的:

    • 基数排序:根据键值的每位数字来分配桶;
    • 计数排序:每个桶只存储单一键值;
    • 桶排序:每个桶存储一定范围的数值;

    2、Illustration(图解)

    在这里插入图片描述

    3、Code(代码)

    var counter = [];
    function radixSort(arr, maxDigit) {
        var mod = 10;
        var dev = 1;
        for (var i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
            for(var j = 0; j < arr.length; j++) {
                var bucket = parseInt((arr[j] % mod) / dev);
                if(counter[bucket]==null) {
                    counter[bucket] = [];
                }
                counter[bucket].push(arr[j]);
            }
            var pos = 0;
            for(var j = 0; j < counter.length; j++) {
                var value = null;
                if(counter[j]!=null) {
                    while ((value = counter[j].shift()) != null) {
                          arr[pos++] = value;
                    }
              }
            }
        }
        return arr;
    }
    

    三、选择排序

    1、Explanation And Steps(解释的步骤)

    选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

    • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

    • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

    • 重复第二步,直到所有元素均排序完毕。

    2、Illustration(图解)

    在这里插入图片描述

    3、Code(代码)

    function selectionSort(arr) {
        var len = arr.length;
        var minIndex, temp;
        for (var i = 0; i < len - 1; i++) {
            minIndex = i;
            for (var j = i + 1; j < len; j++) {
                if (arr[j] < arr[minIndex]) {     // 寻找最小的数
                    minIndex = j;                 // 将最小数的索引保存
                }
            }
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
        return arr;
    }
    

    四、插入排序

    1、Explanation And Steps(解释的步骤)

    插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

    插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

    • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

    • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

    2、Illustration(图解)

    在这里插入图片描述

    3、Code(代码)

    function insertionSort(arr) {
        var len = arr.length;
        var preIndex, current;
        for (var i = 1; i < len; i++) {
            preIndex = i - 1;
            current = arr[i];
            while(preIndex >= 0 && arr[preIndex] > current) {
                arr[preIndex+1] = arr[preIndex];
                preIndex--;
            }
            arr[preIndex+1] = current;
        }
        return arr;
    }
    

    五、希尔排序

    1、Explanation And Steps(解释的步骤)

    希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。

    希尔排序是基于插入排序的以下两点性质而提出改进方法的:

    插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
    但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
    希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

    • 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

    • 按增量序列个数 k,对序列进行 k 趟排序;

    • 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

    2、Illustration(图解)

    在这里插入图片描述

    3、Code(代码)

    function shellSort(arr) {
        var len = arr.length,
            temp,
            gap = 1;
        while(gap < len/3) {          //动态定义间隔序列
            gap =gap*3+1;
        }
        for (gap; gap > 0; gap = Math.floor(gap/3)) {
            for (var i = gap; i < len; i++) {
                temp = arr[i];
                for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
                    arr[j+gap] = arr[j];
                }
                arr[j+gap] = temp;
            }
        }
        return arr;
    }
    

    六、归并排序

    1、Explanation And Steps(解释的步骤)

    归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

    作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

    自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
    自下而上的迭代;
    在《数据结构与算法 JavaScript 描述》中,作者给出了自下而上的迭代方法。但是对于递归法,作者却认为:

    However, it is not possible to do so in JavaScript, as the recursion goes too deep for the language to handle.

    然而,在 JavaScript 中这种方式不太可行,因为这个算法的递归深度对它来讲太深了。

    说实话,我不太理解这句话。意思是 JavaScript 编译器内存太小,递归太深容易造成内存溢出吗?还望有大神能够指教。

    和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。

    • 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

    • 设定两个指针,最初位置分别为两个已经排序序列的起始位置;

    • 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

    • 重复步骤 3 直到某一指针达到序列尾;

    • 将另一序列剩下的所有元素直接复制到合并序列尾。

    2、Illustration(图解)

    在这里插入图片描述

    3、Code(代码)

    function mergeSort(arr) {  // 采用自上而下的递归方法
        var len = arr.length;
        if(len < 2) {
            return arr;
        }
        var middle = Math.floor(len / 2),
            left = arr.slice(0, middle),
            right = arr.slice(middle);
        return merge(mergeSort(left), mergeSort(right));
    }
    
    function merge(left, right)
    {
        var result = [];
    
        while (left.length && right.length) {
            if (left[0] <= right[0]) {
                result.push(left.shift());
            } else {
                result.push(right.shift());
            }
        }
    
        while (left.length)
            result.push(left.shift());
    
        while (right.length)
            result.push(right.shift());
    
        return result;
    }
    

    七、快速排序

    1、Explanation And Steps(解释的步骤)

    快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

    快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

    快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

    快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然 Worst Case 的时间复杂度达到了 O(n²),但是人家就是优秀,在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好,可是这是为什么呢,我也不知道。好在我的强迫症又犯了,查了 N 多资料终于在《算法艺术与信息学竞赛》上找到了满意的答案:

    快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。

    • 从数列中挑出一个元素,称为 “基准”(pivot);

    • 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

    • 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

    递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

    2、Illustration(图解)

    在这里插入图片描述

    3、Code(代码)

    function quickSort(arr, left, right) {
        var len = arr.length,
            partitionIndex,
            left = typeof left != 'number' ? 0 : left,
            right = typeof right != 'number' ? len - 1 : right;
    
        if (left < right) {
            partitionIndex = partition(arr, left, right);
            quickSort(arr, left, partitionIndex-1);
            quickSort(arr, partitionIndex+1, right);
        }
        return arr;
    }
    
    function partition(arr, left ,right) {     // 分区操作
        var pivot = left,                      // 设定基准值(pivot)
            index = pivot + 1;
        for (var i = index; i <= right; i++) {
            if (arr[i] < arr[pivot]) {
                swap(arr, i, index);
                index++;
            }        
        }
        swap(arr, pivot, index - 1);
        return index-1;
    }
    
    function swap(arr, i, j) {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    function partition2(arr, low, high) {
      let pivot = arr[low];
      while (low < high) {
        while (low < high && arr[high] > pivot) {
          --high;
        }
        arr[low] = arr[high];
        while (low < high && arr[low] <= pivot) {
          ++low;
        }
        arr[high] = arr[low];
      }
      arr[low] = pivot;
      return low;
    }
    
    function quickSort2(arr, low, high) {
      if (low < high) {
        let pivot = partition2(arr, low, high);
        quickSort2(arr, low, pivot - 1);
        quickSort2(arr, pivot + 1, high);
      }
      return arr;
    }
    
    

    八、堆排序

    1、Explanation And Steps(解释的步骤)

    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

    大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
    小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
    堆排序的平均时间复杂度为 Ο(nlogn)。

    • 将待排序序列构建成一个堆 H[0……n-1],根据(升序降序需求)选择大顶堆或小顶堆;

    • 把堆首(最大值)和堆尾互换;

    • 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;

    • 重复步骤 2,直到堆的尺寸为 1。

    2、Illustration(图解)

    在这里插入图片描述

    3、Code(代码)

    var len;    // 因为声明的多个函数都需要数据长度,所以把len设置成为全局变量
    
    function buildMaxHeap(arr) {   // 建立大顶堆
        len = arr.length;
        for (var i = Math.floor(len/2); i >= 0; i--) {
            heapify(arr, i);
        }
    }
    
    function heapify(arr, i) {     // 堆调整
        var left = 2 * i + 1,
            right = 2 * i + 2,
            largest = i;
    
        if (left < len && arr[left] > arr[largest]) {
            largest = left;
        }
    
        if (right < len && arr[right] > arr[largest]) {
            largest = right;
        }
    
        if (largest != i) {
            swap(arr, i, largest);
            heapify(arr, largest);
        }
    }
    
    function swap(arr, i, j) {
        var temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    
    function heapSort(arr) {
        buildMaxHeap(arr);
    
        for (var i = arr.length-1; i > 0; i--) {
            swap(arr, 0, i);
            len--;
            heapify(arr, 0);
        }
        return arr;
    }
    

    九、计数排序

    1、Explanation And Steps(解释的步骤)

    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

    大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
    小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
    堆排序的平均时间复杂度为 Ο(nlogn)。

    • 找出原数组中元素值最大的,记为max。

    • 创建一个新数组count,其长度是max加1,其元素默认值都为0。

    • 遍历原数组中的元素,以原数组中的元素作为count数组的索引,以原数组中的元素出现次数作为count数组的元素值。

    • 创建结果数组result,起始索引index。

    • 遍历count数组,找出其中元素值大于0的元素,将其对应的索引作为元素值填充到result数组中去,每处理一次,count中的该元素值减1,直到该元素值不大于0,依次处理count中剩下的元素。

    • 返回结果数组result。

    2、Illustration(图解)

    在这里插入图片描述

    3、Code(代码)

    function countingSort(arr, maxValue) {
        var bucket = new Array(maxValue+1),
            sortedIndex = 0;
            arrLen = arr.length,
            bucketLen = maxValue + 1;
    
        for (var i = 0; i < arrLen; i++) {
            if (!bucket[arr[i]]) {
                bucket[arr[i]] = 0;
            }
            bucket[arr[i]]++;
        }
    
        for (var j = 0; j < bucketLen; j++) {
            while(bucket[j] > 0) {
                arr[sortedIndex++] = j;
                bucket[j]--;
            }
        }
    
        return arr;
    }
    

    十、桶排序

    1、Explanation And Steps(解释的步骤)

    • 桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:

    • 在额外空间充足的情况下,尽量增大桶的数量

    • 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中

    • 同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

    2、Illustration(图解)

    在这里插入图片描述

    3、Productive(效率)

    当输入的数据可以均匀的分配到每一个桶中时最快,当输入的数据被分配到了同一个桶中时最慢。

    4、Code(代码)

    function bucketSort(arr, bucketSize) {
        if (arr.length === 0) {
          return arr;
        }
    
        var i;
        var minValue = arr[0];
        var maxValue = arr[0];
        for (i = 1; i < arr.length; i++) {
          if (arr[i] < minValue) {
              minValue = arr[i];                // 输入数据的最小值
          } else if (arr[i] > maxValue) {
              maxValue = arr[i];                // 输入数据的最大值
          }
        }
    
        //桶的初始化
        var DEFAULT_BUCKET_SIZE = 5;            // 设置桶的默认数量为5
        bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
        var bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;   
        var buckets = new Array(bucketCount);
        for (i = 0; i < buckets.length; i++) {
            buckets[i] = [];
        }
    
        //利用映射函数将数据分配到各个桶中
        for (i = 0; i < arr.length; i++) {
            buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
        }
    
        arr.length = 0;
        for (i = 0; i < buckets.length; i++) {
            insertionSort(buckets[i]);                      // 对每个桶进行排序,这里使用了插入排序
            for (var j = 0; j < buckets[i].length; j++) {
                arr.push(buckets[i][j]);                      
            }
        }
    
        return arr;
    }
    
    展开全文
  • js皮尔逊算法

    2018-09-11 14:20:49
    js实现皮尔逊算法有完成的算法,需要自己引用jquery文件,本人自创
  • js代码-js回文算法

    2021-07-16 15:52:57
    js代码-js回文算法
  • js-算法 JavaScript 算法和数据结构。
  • JavaScript 遗传算法编程库 样品 执照 (麻省理工学院许可证)
  • javascript 链表算法

    2019-01-09 17:17:29
    JavaScript算法,其中的链表操作的部分包括插入和删除
  • JS常见算法详解

    2020-12-10 02:36:20
    算法是程序的灵魂,一个优秀前端工程师对算法也是要有所了解的,本文总结了我们在开发、面试中经常会遇到的基础算法,使用原生JS实现,未必是最优解,可以互相探讨。 为了便于查看,简单分下类,本文也会持续更新。 ...
  • 主要介绍了javascript动画算法,实例分析了javascript实现动画效果的实现及使用技巧,需要的朋友可以参考下
  • js国密算法sm2以及国密算法sm3 js的实现以及例子 js国密算法sm2以及国密算法sm3 js的实现以及例子

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 278,568
精华内容 111,427
关键字:

js图的算法