js——归并排序(mergeSort)代码实现

news/2024/5/17 18:13:33 标签: 归并排序, 数组操作

归并排序是一种稳定排序,有必要掌握它;以下是详细代码加注释。先看一张归并排序算法对待排序数组的分割:

<a class=归并排序示意图" class="has" height="300" src="https://img-blog.csdnimg.cn/20190508214701975.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI3OTU0NjQz,size_16,color_FFFFFF,t_70" width="274" />

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>归并排序</title>
</head>
<body>
	<script type="text/javascript">

		//归并排序:首先把数组分成两半,再分两半,一直到不可分,数组长度为1;
       //接着调用merge函数,对左右数组排序,然后递归,最后实现整个数组的归并排序。

		function mergeSort(arr) {
			var len = arr.length;
			if(len > 1) {
				var index = Math.floor(len / 2);
				console.log(index);
			    var left = arr.slice(0,index); //得到下标从0~index-1的数组
			    var right = arr.slice(index);  //得到下标从index开始到末尾的数组
			    return merge(mergeSort(left) , mergeSort(right));  //里面采用递归
			}else {
				return arr;
			}
		}

		
		function merge(left , right) {
		    //每次left或者right都是要shift掉第一个元素,表示left或者right是会变化的,最后arr.concat左右数组,
            //因为不知道left或者right其中哪个数组剩下元素,简单做法,干脆将left和right数组都进行concat。
			var arr = [];
			while(left.length && right.length) {
				if(left[0] < right[0]) {
					arr.push(left.shift());
				}else {
					arr.push(right.shift());
				}
			}
			//console.log(left+"——"+right);
            //可以打印验证一下每次merge的时候,剩下的是left数组还是right数组里面的元素;加深对归并排序的理解
			return arr.concat(left , right);
		}

		var arr=[4,19,60,10,66];                                                                                                                 
		console.log('beforeSort:'+arr);
		mergeSort(arr);
		console.log('afterSort:'+arr);
</script>
</body>
</html>

浏览器F12控制台打印结果:


http://www.niftyadmin.cn/n/1426082.html

相关文章

抓弹窗

这种方法可以弹出 <div id"bodyframe" style"VISIBILITY: hidden"> <iframe src"http://127.0.0.1:8081/Ad/count/fshow.jsp?id4" /> </iframe> </div> 这种方法有时候弹不出,不知道怎么回事 <script language…

js——合并两个有序数组详细代码实现

这道题是我在腾讯面试的时候被问到的&#xff0c;当时的回答实在难以令人满意。这道题本来也不难&#xff0c;然后我就一步步尝试性地回答推进&#xff0c;首先&#xff0c;可以直接用数组方法concat&#xff08;&#xff09;&#xff0c;当合并后数组并不关心大小排序时。接下…

每次只展开一组的折叠菜单

<script> function switchMenu(evt){ var eleevt.target||evt.srcElement; //分别针对非ie和ie&#xff0c;获取事件的源对象 if(ele.tagName"H1"){ //如果是<h1> var uluele.parentNode.getElementsByTagName("ul"); for(var i0;i<ulu.le…

js——join() 和 toString()的区别详解

其实是很小的知识点&#xff0c;在刷牛客网算法的时候&#xff0c;自己经常搞错。区别如下 例子&#xff1a; 从上面绿色画笔的地方可以看出来&#xff0c;这两种数组转字符串的方法有细微区别的&#xff0c;要小心。

jsp中刷新servlet验证码

<img alt"看不清楚?点击更换验证码" src"../servlet1" οnclick"this.src../servlet1"/> 修改图片的src属性&#xff0c;给它重新赋值就可以刷新图片, 但是由于缓存的问题&#xff0c;如果两次都是同样的值&#xff0c;浏览器一般都不会…

下拉框控制div显示与隐藏

下拉框控制div显示与隐藏<% page language"java" contentType"text/html; charsetGB2312" import"java.sql.*"%><jsp:useBean id"db" class"com.pp.db.DBOperation"></jsp:useBean><%String path re…

sqlserver数据库的移植

sqlserver数据库的移植一、备份数据库 1、打开SQL企业管理器&#xff0c;在控制台根目录中依次点开Microsoft SQL Server2、SQL Server组-->双击打开你的服务器-->双击打开数据库目录3、选择你的数据库名称&#xff08;如论坛数据库Forum&#xff09;-->然后点上面菜…

MySQL的数据类型和建库策略

无论是在小得可怜的免费数据库空间或是大型电子商务网站&#xff0c;合理的设计表结构、充分利用空间是十分必要的。这就要求我们对数据库系统的常用数据类型有充分的认识。下面我就将我的一点心得写出来跟大家分享。 一、 数字类型 数字类型按照我的分类方法分为三类&#x…