/*********************************************JS归并排序***************************************************/
 
/*之前学习了一下归并算法,现在想把他分享给大家*/

/*
 * 归并排序,分开数组,不断一分为二直到只剩一个元素(这里用到递归思想,不断自己分开自己), 
 * 然后对分开的自己进行排序,在归并的路上不断排序,从而实现最终排序
 * 时间复杂度O(NlogN)
 * 它的速度仅次于快速排序,而且很稳定
 * 但是空间需求一般会高点,大型的项目或者数据均为有序的时候用归并排序会多点
 */
function mergeSort(arr) {               //我们先在主函数中定义分离方法,最后在结果中调用排序算法
    if(arr.length === 1){               //定义递归终止条件,当元素均为1个时,开始归并
        return arr ;
    }
    let mid = Math.floor((arr.length)/2);       //Math.floor用以寻找当前给的数,如果没有则向下寻找最近的
    let left = arr.slice(0,mid);                //调用slice方法来返回数组,其不改变原数组
    let right = arr.slice(mid);
    return rank(mergeSort(left),mergeSort(right));      //递归用在了这里
}
function rank(left,right) {
    let result = [];                                            //定义容器
    let pl = 0,                                                 //定义两个指针
        pr = 0;
    
    while(pl < left.length && pr < right.length){    //两个数组只要都同时有数,就进行循环
        if(left[pl] < right[pr]){                    //这里的两个数组必然是都已经排序完成了,互相比较即可
            result.push(left[pl]);
            pl++;                                    //谁添加了数组元素,谁就移动一下自己的指针,所以这里用while不用for
        }else{
            result.push(right[pr]);
            pr++;
        }
    }
    while(pl < left.length){                         //上面循环结束的条件是有一个数组循环结束了
        result.push(left[pl]);                       //他们俩不可能同时有数,所以不管谁剩了,统统添加进去
        pl++;
    }
    while(r < right.length){
        result.push(right[pr]);
        pr++;
    }
    return result;
}
console.log(mergeSort([2,58,5,6,5,89,38]))

基于JS实现归并排序算法的更多相关文章

  1. 常见排序算法基于JS的实现

    一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列 ...

  2. JavaScript基于时间的动画算法

    转自:https://segmentfault.com/a/1190000002416071 前言 前段时间无聊或有聊地做了几个移动端的HTML5游戏.放在不同的移动端平台上进行测试后有了诡异的发现, ...

  3. 转载~基于比较的排序算法的最优下界为什么是O(nlogn)

    基于比较的排序算法的最优下界为什么是O(nlogn) 发表于2013/12/21 16:15:50  1024人阅读 分类: Algorithm 1.决策二叉树 回答这个问题之前我们先来玩一个猜数字的 ...

  4. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  5. 基于JS功能强大的日期插件Kalendae

    开发中需要一个日期插件,可以在zepto下使用,可以选择日期段,可以设置不可选日期 找到一个完全满足的,并且基于JS不依赖于任何库. 在线演示:http://chipersoft.com/Kalend ...

  6. 必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解

    一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并 ...

  7. Breach - HTML5 时代,基于 JS 编写的浏览器

    Breach 是一款属于 HTML5 时代的开源浏览器项目,,完全用 Javascript 编写的.免费.模块化.易于扩展.这个浏览器中的一切都是模块,Web 应用程序在其自己的进程运行.通过选择合适 ...

  8. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

    最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...

  9. mahout入门指南之基于mahout的itembased算法

    基于mahout的itembased算法 事实上mahout分布式上仅仅是实现了部分算法.比方推荐算法中Item-based和slopone都有hadoop实现和单机版实现,User-based没有分 ...

随机推荐

  1. vue 弹窗时 监听手机返回键关闭弹窗(页面不跳转)

    [注]:  popstate 事件 a.当活动历史记录条目更改时,将触发popstate事件. b.如果被激活的历史记录条目是通过对history.pushState()的调用创建的,或者受到对his ...

  2. ioctl 命令的实现

    ioctl 的 scull 实现只传递设备的配置参数, 并且象下面这样容易: switch(cmd) { case SCULL_IOCRESET: scull_quantum = SCULL_QUAN ...

  3. 基于ubuntu16的mqtt服务器(apache-apollo1.7.1)

    感谢博客:https://www.cnblogs.com/chenrunlin/p/5109028.html 需要环境: java1.8 把文件通过finalshell扔到/usr/local目录下 ...

  4. C# 标准性能测试高级用法

    本文告诉大家如何在项目使用性能测试测试自己写的方法 在 C# 标准性能测试 已经告诉大家如何使用 BenchmarkDotNet 测试性能,本文会告诉大家高级的用法. 建议是创建一个控制台项目用来做性 ...

  5. Delta Lake基础操作和原理

    目录 Delta Lake 特性 maven依赖 使用aws s3文件系统快速启动 基础表操作 merge操作 delta lake更改现有数据的具体过程 delta表schema 事务日志 delt ...

  6. 数据库java包

    package com.hgkj.model.dao.impl; import java.sql.*; public class DBManager { private static final St ...

  7. 利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。

    正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的‘好’东西记 ...

  8. python单例设计模式

    class Dog(object): __instance = None def __init__(self): pass def __new__(cls): if not cls.__instanc ...

  9. 超详细Node安装教程

    今天周末休息,我制定了我的2020年度规划,其中包含编写50篇养成写博文的习惯.算下来平均每周一篇,感觉也不是很难,但我的写作能力不是很好,争取一次比一次好!希望自己能够坚持下去.2020为自己而活, ...

  10. jupyter启动后,浏览器自动打开,但是显示空白

    解决办法 1.在Windows菜单中,搜索regedit,打开它.2.导航到计算机> HKEY_CLASSES_ROOT> .js> Content Type(如果没找到需要新建或直 ...