在学习归并排序之前,有必要了解分治法,因为归并排序正是应用了分治模式。(基本定义摘自《算法导论》)

一、分治法

1、思想:

将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解。

2、三个步骤

分治法在每层递归时有三个步骤:

(1)分解:

分解原问题分解为若干子问题,这些子问题是原问题的规模较小的实例。

**举例:**比如,全班同学随意排成了一行,这时高矮顺序是乱的,现在要按身高排序,可以把问题分解为把前一半按身高排好序,后一半也按身高排好序两个子问题。

**另外:**若干表明子问题不一定是2个,若是2个则是归并排序。

(2)解决

解决这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。

举例: 分别解决给前一半和后一半排序的子问题。比如,给前一半排序,又再次将问题分解为给前1/4排序和给1/4到1/2的部分排序,解决这两个子问题后采用合并算法合并就得到前一半的身高排序。

事实上,给前1/4排序又可以再次分解…

直到分解为单个同学排序,这时无须再分解,排序后的序列就是他自己。

(3)合并

合并这些子问题的解成原问题的解。

**举例:**采用合并算法将已排好序的前一半队列和后一半队列合并,就得到所有人的身高排序。

二、归并排序

归并排序完全遵循分治模式。

1、步骤:

(1)分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。

(2)解决:使用归并排序递归地排序两个子序列。

(3)合并:合并两个已排序的子序列以产生已排序的答案。

2、关键:

“合并”步骤中两个已排序序列的合并。

3、合并算法:

假设这时前一半和后一半各自都已经排好序,最矮的都在各部分的最前面,这时只需合并两个排序就可以得到全班的排序。合并算法类似这样:

(1)假设前一半队列最矮的是甲,后一半队列中最矮的是乙,比较甲和乙,两者中最矮的命名为a,将a放到合并队列中,这时合并队列中只有a一人。

(2)再次比较前一半队列和后一半队列中最矮的同学,假设现在b最矮,将b放到合并队列中a的后面,这时合并队列有a、b两个人。

(3)…

(4)直到前一半队列或者后一半队列没人。假设前一半队列没人了,现在后一半队列中剩下的同学都比已合并的同学高,直接将剩余的同学依次排到已合并的队列后面,排序完成。

三、我的JavaScript实现

	function merge_sort(arr) {
if (arr.length>1) {
var array=[];
var l=Math.floor(arr.length/2);
for (var i = 0; i < l; i++) {
array.push(arr.pop());
}
merge_sort(arr);
merge_sort(array);
merge(arr, array);
}else{
return arr;
}
}
function merge(arr1,arr2) {
var arr=[];
while(arr1.length&&arr2.length){
if (arr1[0]<=arr2[0]) {
arr.push(arr1.shift());
}else{
arr.push(arr2.shift());
}
}
if (arr1.length) {
for (var i = 0; i < arr1.length; i++) {
arr.push(arr1.shift());
}
}else if (arr2.length) {
for (var j = 0; j < arr2.length; j++) {
arr.push(arr2.shift());
}
}
var l=arr.length;
for (var i = 0; i < l; i++) {
arr1.push(arr.shift());
}
}
var a=[11,2,3,445,7,32,71,1,94];
merge_sort(a);
console.log(a);
var b=[94,11];
merge_sort(b);
console.log(b);

以上代码还有可以优化的空间,对比了下其他人的实现,若采用slice似乎要简单一些。

啃算法:归并排序及JavaScript实现的更多相关文章

  1. 【前端也要学点算法】 归并排序的JavaScript实现

    前文我们了解了快速排序算法的实现,本文我们来了解下另一种流行的排序算法-归并排序算法. 我们先来回顾下快排.快排的核心是找出一个基准元素,把数组中比该元素小的放到左边数组,比该元素大的放到右边数组,如 ...

  2. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  3. 数据结构和算法(Golang实现)(23)排序算法-归并排序

    归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...

  4. 使用 js 实现十大排序算法: 归并排序

    使用 js 实现十大排序算法: 归并排序 归并排序 refs js 十大排序算法 All In One https://www.cnblogs.com/xgqfrms/p/13947122.html ...

  5. JavaScript排序算法——归并排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. javascript排序算法-归并排序

    归并排序 概念:归并排序是一种分治算法.其思想是将原始数组切分成较小的数组,直到每个小数组只有一个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组. 时间复杂度: O(nlogn) ...

  7. 十大经典排序算法总结(JavaScript描述)

    前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...

  8. 常见的排序算法总结(JavaScript)

    引言 排序算法是数据结构和算法之中的基本功,无论是在笔试还是面试,还是实际运用中都有着很基础的地位.这不正直七月,每年校招的备战期,所以想把常见的排序算法记录下来.在本篇文章中的排序算法使用 Java ...

  9. [算法]——归并排序(Merge Sort)

    归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...

随机推荐

  1. 会 Linux 用户管理的不一定是网管吧

    管理用户文件 用户账户文件 /etc/passwd账户号文件 在Linux系统中,创建的用户账户及其相关信息,均放在/etc/passwd配置文件中. 这个文件中每一行代表一个用户的资料. 每一行使用 ...

  2. C语言 文件复制

    有很多人会问,学会C语言能干啥?,就只能控制台敲个数学题,做个界面都没有的贪吃蛇么? 刚开始的我,也是这样想的,但慢慢深入C语言后,我才领略到C的强大,C的万能.小到游戏破解,加解密算法,大到设备驱动 ...

  3. 八、路由详细介绍之动态路由OSPF(重点)

    一.OSPF介绍 OSPF优点:无环路.收敛快.扩展性好.支持认证 二.工作原理: 图中RTA.RTB.RTC每个路由器都会生成一个LSA, 通过LSA泛洪进行互相发送相互学习,形成LSDB (链路状 ...

  4. 计算机网络-CSMA/CD

    假定1km长的CSMA/CD网络的传输速率为1Gbit/s.设信号在网络上的传播速率为200000km/s,则能够使用此协议的最短帧长是? 答案:2×104bit/s 解析:C=2×105km/s,即 ...

  5. 1 - Apache HttpClient 简单使用

    Apache HttpClient 是Apache 开源的实现Http协议的java开源库. HttpClien 是客户端的HTTP通信实现库,实现HTTP GET 和POST请求,获取响应内容. A ...

  6. L17 AlexNet VGG NiN GoogLeNet

    深度卷积神经网络(AlexNet) LeNet: 在大的真实数据集上的表现并不尽如⼈意. 1.神经网络计算复杂. 2.还没有⼤量深⼊研究参数初始化和⾮凸优化算法等诸多领域. 机器学习的特征提取:手工定 ...

  7. Python生成一维码

    参考页面 https://pypi.org/project/python-barcode/ 利用python-barcode的库 一.安装python-barcode库 #安装前提条件库 pip in ...

  8. Git把本地代码推送到远程github仓库

    运用Git版本控制系统进行代码的管理,以便于团队成员的协作,由于之前是使用svn来进行版本控制,所以对于Git使用还有待熟练掌握.Git与svn类似,个人认为两者之间比较直观的区别就是 Git 不需要 ...

  9. SQL SERVER 那点事

    温故而知新 一.创建数据库 USE MASTER; GO IF EXISTS(SELECT * FROM sys.databases WHERE [name] = 'student') BEGIN A ...

  10. Joomla 3.4.6 RCE 分析

    Joomla 3.4.6 RCE 漏洞分析,首发先知社区: https://xz.aliyun.com/t/6522 漏洞环境及利用 Joomla 3.4.6 : https://downloads. ...