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

一、分治法

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. 怎么用scratch做大鱼吃小鱼

    行走代码不说了.出鱼代码大概就是 棋子被点击时 重复执行 移到x:从()到()任意选一个数,y一样 克隆自己 等待你想要的秒数.吃鱼代码就是 当作为克隆体启动是 重复执行 如果碰到()那么 删除克隆体 ...

  2. istream_iterator && istream_iteratorbuf

    注意 读字符时, std::istream_iterator 默认跳过空白符(除非用 std::noskipws 或等价物禁用,而 std::istreambuf_iterator 不跳过.另外, s ...

  3. 在SpringBoot中使用SpringSecurity

    @ 目录 提出一个需求 解决方案: 使用SpringSecurity进行解决 SpringSecurity和SpringBoot结合 1. 首先在pom.xml中引入依赖: 2. 配置用户角色和接口的 ...

  4. Go gRPC进阶-TLS认证+自定义方法认证(七)

    前言 前面篇章的gRPC都是明文传输的,容易被篡改数据.本章将介绍如何为gRPC添加安全机制,包括TLS证书认证和Token认证. TLS证书认证 什么是TLS TLS(Transport Layer ...

  5. Mycat使用配置实践

    本来写了好多,关于配置的解释和使用以及注意,但是发现有点啰嗦含金量也不高,所以直接把实际使用的一个例子放着吧,供参考. <!DOCTYPE mycat:schema SYSTEM "s ...

  6. js操作svg整体缩放

    首先我们先创建一个svg整体布局,代码如下: <!DOCTYPE html> <html> <head> <title>js操作svg实现整体缩放< ...

  7. L20 梯度下降、随机梯度下降和小批量梯度下降

    airfoil4755 下载 链接:https://pan.baidu.com/s/1YEtNjJ0_G9eeH6A6vHXhnA 提取码:dwjq 梯度下降 (Boyd & Vandenbe ...

  8. sqli-labs通关教程----41~50关

    第四十关 与前几关一样,闭合变成') 插入数据 ?id=1') ;insert into users(id,username,password) values('17','aaa','bbb'); % ...

  9. billu b0x2靶机渗透

    实战渗透靶机billu b0x2 攻击kali :192.168.41.147 靶机b0x2: 192.168.41.148 起手先nmap扫了一下 扫到了四个开放的端口,有ssh,http,rpcb ...

  10. MySQL使用mysqldump+binlog完整恢复被删除的数据库

    (一)概述 在日常的MySQL数据库运维过程中,可能会遇到用户误删除数据,常见的误删除数据操作有: 用户执行delete,因为条件不对,删除了不应该删除的数据(DML操作): 用户执行update,因 ...