基于JS实现归并排序算法

/*********************************************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]))

原文地址:https://www.cnblogs.com/liuxinfuchen/p/12230186.html

时间: 2024-08-01 20:04:08

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

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

一:冒泡排序 1. 原理 a. 从头开始比较相邻的两个待排序元素,如果前面元素大于后面元素,就将二个元素位置互换 b. 这样对序列的第0个元素到n-1个元素进行一次遍历后,最大的一个元素就“沉”到序列的最后位置(第n-1个位置,n为待排序元素个数) c.排除此次排序最后面的那个元素(n=n-1),继续对剩余序列重复前面两步 d. 当(n= n-1)=0时,排序完成 2. 具体实现 以如下待排序序列为例: 到此,第一次冒泡完成,最大值7冒泡到最后面. 然后继续对除最后元素(7)外的序列进行冒泡排序

自底向上的归并排序算法

1.什么是自底向上的归并排序? 说到底,不管是前面说的自顶向下的归并排序还是现在讲的自底向上的归并排序,其实质都是归并. 来看看一个演示过程:          这个就是待排序的数组序列          先将数组序列以2个元素为一组分成4组,每个组内部分成2个子序列进行向上合并           这是合并之后的效果           然后以4个元素为一组分成2组,每个组内部分成2个子序列进行向上合并           这是合并之后的效果           然后以8个元素为一组分成1个组

JavaScript基于时间的动画算法

转自:https://segmentfault.com/a/1190000002416071 前言 前段时间无聊或有聊地做了几个移动端的HTML5游戏.放在不同的移动端平台上进行测试后有了诡异的发现,有些手机的动画会“快”一点,有些手机的动画会“慢”一点,有些慢得还不是一两点. 通过查找资料发现,基于帧的算法(Frame-based)来实现动画会导致不同帧率的平台体验不一致,而基于时间(Time-based)的动画算法可以很好地改良这种情况,让不同帧率的情况下都能达到较为统一的速度上的体验. 本

ArcGIS水分分析工具的流向分析是基于D8单流向算法

ArcGIS水分分析工具的流向分析是基于D8单流向算法,如果分析使用的DEM存在凹陷点,就会产生汇,导致径流断流从而影响了分析结果.在前面章节<ArcGIS水文分析实战教程(2)ArcGIS水文分析工具的基本原理>中又介绍过D8算法,而<ArcGIS水文分析实战教程(4)地形预处理>章节中笔者也较少过如何创建无凹陷点得DEM数据,在使用流向分析工具之前可以先行阅读. 首先流向分析要使用填洼过的数据,确保DEM数据没有凹陷点.如果数据准备妥当,直接使用水文分析工具箱中的[流向]工具进

在Hadoop上运行基于RMM中文分词算法的MapReduce程序

原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词算法的MapReduce程序 23条回复 我知道这个文章标题很“学术”化,很俗,让人看起来是一篇很牛B或者很装逼的论文!其实不然,只是一份普通的实验报告,同时本文也不对RMM中文分词算法进行研究.这个实验报告是我做高性能计算课程的实验里提交的.所以,下面的内容是从我的实验报告里摘录出来的,当作是我学

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

一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序示例: 合并方法: 设r[i-n]由两个有序子表r[i-m]和r[m+1-n]组成,两个子表长度分别为n-i +1.n-m. j=m+1:k=i:i=i; //置两个子表的起始下标及辅助数组的起始下标 若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束 //选取r[i]和r[j]

jquery:基于js的框架

jquery:基于js的框架 框架: 1.方便使用 2.解决了兼容性的问题 官方网站jQuery.com(2点几版本的不支持IE6.7.8) this 当前环境下指代的对象 闭包(closer) 1.可以让局部变量持续的保存下来 在一个函数(对象)里面定义一个函数,这个内部函数可以访问外面函数的局部变量,而且可以让外面的变量引用,可以持续保存局部变量 一个函数里面必须包含一个函数,而且要引用外面函数的变量,里面的函数必须要返回出去,可以使用相同名称的变量 缺点:对内存耗需比较大,可能会导致内存泄

一个简单的基于内容的推荐算法

最近闲下来又开始继续折腾推荐系统了,声明一下,本文只是介绍一下最基础的基于内容的推荐系统(Content-based recommender system)的工作原理,其实基于内容的推荐系统也分三六九等Orz,这里只是简单的较少一下最原始的.最基本的工作流程. 基于内容的推荐算法思路很简单,它的原理大概分为3步: 1.为每个物品(Item)构建一个物品的属性资料(Item Profile) 2.为每个用户(User)构建一个用户的喜好资料(User Profile) 3.计算用户喜好资料与物品属

归并排序算法--java

归并排序(Merge)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为2-路归并. 归并排序算法稳定,数组需要O(n)的额外空间,链表需要O(log(n))