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

JavaScript实现归并排序算法

归并排序稍微复杂一丢丢,但是它的性能比前面的冒泡、选择和插入排序都好一点,是可以用在实战中的排序算法,听说以前火狐浏览器就是用它的归并排

归并排序稍微复杂一丢丢,但是它的性能比前面的冒泡、选择和插入排序都好一点,是可以用在实战中的排序算法,听说以前火狐浏览器就是用它的

归并排序算法动图

一、归并排序的算法思路

底下的过程也不知道有没有说清楚,我总结一下就是,每每劈成两半,分成大组,大组里面分小组,一直二分,分到一个一组,不能分了,就是套娃
然后再从左边开始,从最小的组开始两两比较大小,左边两个比一下,右边两个比一下,再这四个比一下,再往外扩大范围用这个方式去比~


之前的过程说明

为了说清楚,假如有10个数

1、分组

先分组,大组分小组,再分小小组,直到分成一个数一组
左边是L,右边是R,每一个-表示后面的细分小组
(1)归并排序就是先对半劈,分成左边L1组5个和右边R2组5个两组
(2)左边5个分成左左边L1-L1组3个和右右边L1-R1组2个两组
(3)左左边的3个分成左左左边L1-L1-L1组的2个和右右右边L1-R1-L1组的1个
(4)左左左边的2个分成左左左左边L1-L1-L1-L1组的1个和右右右右边L1-L1-L1-R1组的1个
(5)前面的右边也要分直到分成1个和1个,省略不写了
这个要结合前面那个网址的动图来看~
请添加图片描述

2、排序

(1)左左左左边L1-L1-L1-L1组的1个数和右右右右边L1-L1-L1-R1组的1个数,来排序
小的一个就站出来,站到前面,另一个排到它后面,再回到队列里
(2)L1-L1-R1-L1组的1个数和右右右右边L1-L1-R1-R1的一个数比较
(3)这样的话,L1-L1的左边和L1-L1的右边就排好了是不是,再把
L1-L1-L1组的和L1-L1-R1的排列一下
啊啊啊~我好累。。。。。还是看图吧,不写了
请添加图片描述

二、编码实现

根据一的算法思路很明显的发现
第一需要递归不断的对半分
第二需要一个队列排序,每次小组排序时,把小的拿出来放在队列头

Array.prototype.mergeSort &#61; function() {const rec &#61; (arr) &#61;> {const len &#61; arr.length;// 已经分到1个1组&#xff0c;不能再分啦if(len &#61;&#61;&#61; 1) return arr;const mid &#61; Math.floor(len/2);const leftArr &#61; arr.slice(0, mid);const rightArr &#61; arr.slice(mid, len);// 来递归分组啦// 这两个看做队列const leftOrder &#61; rec(leftArr);const rightOrder &#61; rec(rightArr);// 结果数组const res &#61; [];// 分好组就来小组排序while(leftOrder.length || rightOrder.length) {if(leftOrder.length && rightOrder.length) {// 比较队列头&#xff0c;小的就shift出来push到res里res.push(leftOrder[0] < rightOrder[0] ? leftOrder.shift(0) : rightOrder.shift(0));} else if(leftOrder.length) {res.push(leftOrder.shift(0));} else if(rightOrder.length) {res.push(rightOrder.shift(0));} else {break;}}return res;}const res &#61; rec(this);// 将res赋值到this也就是传进来的数组本身上res.forEach((item, key) &#61;> {this[key] &#61; item;})
}const arr &#61; [1, 5, 9, 3, 18, 6, 2, 7, 0, 6]
arr.mergeSort()
console.log(arr);

三、算法时间复杂度

1、两两分组&#xff0c;用上递归&#xff0c;这种时间复杂度一般都是O(logn)
2、排序&#xff0c;也就是递归里面有个while循环&#xff0c;看到了吧&#xff0c;这种就是O(n)
所以这个排序算法的时间复杂度是O(nlogn)

终于写完了&#xff0c;写完发现也不是很难~算法还是以理解为主吧


推荐阅读
  • vue使用
    关键词: ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
author-avatar
我hi7娘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有