热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js合并排序算法的道理及简朴demo

近来看了一道“怎样给阿里两万多名员工根据岁数排序”的面试题后,很想记录下来本身的解题思绪,下面:综合考虑到基数较大和稳定性,我们采纳兼并排序的算法;兼并算法分为两个两个魂魄步骤,即

近来看了一道“怎样给阿里两万多名员工根据岁数排序”的面试题后,很想记录下来本身的解题思绪,下面:
综合考虑到基数较大和稳定性,我们采纳兼并排序的算法;
兼并算法分为两个两个魂魄步骤,即:拆分=>兼并;
我们先把两万多名员工的基数缩小至六名员工的基数,他们的岁数数组未排序前为[25,18,17,31,25,30],我们完成第一个魂魄操纵,拆分:
兼并算法的拆分头脑是将一个数组一分为二,然后将分出来的数组继承一分为二,直至涌现单个数组的长度为1,不可再分为止;

《js合并排序算法的道理及简朴demo》

如上图,一个长度为6的数组根据摆布构造一向拆分至6个长度为1的数组,拆分就终了了,这时刻我们由下往上回溯,将数组兼并,图解:

《js合并排序算法的道理及简朴demo》

六个长度为一的数组兼并之后又变成了一个长度为6的数组,然则排序发生了转变,这就是兼并算法,下面是代码完成:

我们一步一步来,第一步先来完成拆分的部份:

// 拆分
function mergeSort(arr){
console.log(`arr=${arr}`)
if(arr.length==1){//假如数组长度为1则返回数组
return arr
}
var mid=Math.floor(arr.length/2);//将数组一拆分为二
var left=arr.slice(0,mid);
var right=arr.slice(mid);
mergeSort(left);//假如数组长度不为1,则继承递归拆分,(由控制台可以看出递归会先将left实行完后再去实行right)
mergeSort(right)
}
console.log(mergeSort([25,18,17,31,25,30]))

控制台打印出效果:

《js合并排序算法的道理及简朴demo》
这个时刻我们可以看到,我们已采纳递归的体式格局将数组拆分为六个长度为一的数组了,接下来走第二步的兼并,兼并的头脑是摆布两个数组的第一个元素比较大小,然后将大的数(或许小的数)提取出来存放在一个第三方数组,直接上代码:

// 兼并
function merge(left,right){
var arr=new Array;//新建一个第三方数组
if(left[0]<=right[0]){//比较left的第一位和right的第一位谁小,小的提取出来push进第三方数组
arr.push(left.shift())
}else{
arr.push(right.shift())
}
return arr.concat(left).concat(right)//将提取出来的数组和原数组兼并成一个数组
};
console.log(merge([25],[30]))//代码到这一步只是展现了兼并的道理和思绪,并不完全,我们不急,先用简朴的单位素数组举行排序兼并,这也是兼并的第一层兼并

《js合并排序算法的道理及简朴demo》

控制台打印出[25,30],申明我们的兼并和排序都是胜利的,下面我们将晋级两个函数,使其可以正式地操纵庞杂的兼并排序:

// 兼并
function merge(left,right){
var arr=new Array;//新建一个第三方数组
while(left.length>0&&right.length>0){////比较left的第一位和right的第一位谁小,小的提取出来push进第三方数组
if(left[0]<=right[0]){
arr.push(left.shift())
}else{
arr.push(right.shift())
}
};
return arr.concat(left).concat(right)//将提取出来的数组和原数组兼并成一个数组
};
// 拆分
function mergeSort(arr){
console.log(`arr=${arr}`)
if(arr.length==1){//假如数组长度为1则返回数组
return arr
};
var mid=Math.floor(arr.length/2);//将数组一拆分为二
var left=arr.slice(0,mid);
var right=arr.slice(mid);
return merge(mergeSort(left),mergeSort(right))
};
console.log(mergeSort([25,18,17,31,25,30]))

控住台打印:
《js合并排序算法的道理及简朴demo》
至此,我们的兼并排序胜利!
迎接列位大小神偕行予以指正和讨论


推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
author-avatar
爱智孝的蛋清汤
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有