啃算法:归并排序及JavaScript实现
在学习归并排序之前,有必要了解分治法,因为归并排序正是应用了分治模式。(基本定义摘自《算法导论》)
一、分治法
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实现的更多相关文章
- 【前端也要学点算法】 归并排序的JavaScript实现
前文我们了解了快速排序算法的实现,本文我们来了解下另一种流行的排序算法-归并排序算法. 我们先来回顾下快排.快排的核心是找出一个基准元素,把数组中比该元素小的放到左边数组,比该元素大的放到右边数组,如 ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
- 数据结构和算法(Golang实现)(23)排序算法-归并排序
归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...
- 使用 js 实现十大排序算法: 归并排序
使用 js 实现十大排序算法: 归并排序 归并排序 refs js 十大排序算法 All In One https://www.cnblogs.com/xgqfrms/p/13947122.html ...
- JavaScript排序算法——归并排序
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- javascript排序算法-归并排序
归并排序 概念:归并排序是一种分治算法.其思想是将原始数组切分成较小的数组,直到每个小数组只有一个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组. 时间复杂度: O(nlogn) ...
- 十大经典排序算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算法总结 这世界 ...
- 常见的排序算法总结(JavaScript)
引言 排序算法是数据结构和算法之中的基本功,无论是在笔试还是面试,还是实际运用中都有着很基础的地位.这不正直七月,每年校招的备战期,所以想把常见的排序算法记录下来.在本篇文章中的排序算法使用 Java ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
随机推荐
- mysql物理级别热备脚本
#!/bin/bash mysql_backup_dir=/data/databaseup/ mysql_username="root" mysql_password=" ...
- app测试的一些较为重要的测试点
安装测试 从不同的手机所自带的不同的版本的软件商城里面下载抖音并安装查看是否成功 安装后是否能正常运行安装后的文件和文件夹是否写到了指定的目录里 安装过程中取消安装,安装的文件是否在指定的目录里 安装 ...
- python--模块、列表生成式、集合元祖列表
一.导入模块的两种方式 1.直接使用import import 模块名 #调用 模块名.方法名() 2.使用from…import… from 模块名 import 方法名1,方法名2(from 模块 ...
- 搭建DVWA Web渗透测试靶场
文章更新于:2020-04-13 按照惯例,需要的文件附上链接放在文首. 文件名:DVWA-1.9-2020.zip 文件大小:1.3 M 文件说明:这个是新版 v1.9 (其实是 v1.10开发版) ...
- Linux配置dhcp服务器
一.安装dhcp软件 yum -y install dhcp 二.配置 dhcp 主配置文件 /etc/dhcp/dhcpd.conf ns-update-style interim; log-fac ...
- openpyxl 模块 读写Excel
import openpyxl #写到execl中def write_execl(): book=openpyxl.Workbook() sheet=book.active #获取默认sheet # ...
- 4. git log的常见用法
git log ======见https://blog.csdn.net/daguanjia11/article/details/73823617 +++++++++++++++++++++++ 使用 ...
- 【题解】P2480 [SDOI2010]古代猪文 - 卢卡斯定理 - 中国剩余定理
P2480 [SDOI2010]古代猪文 声明:本博客所有题解都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 题目描述 猪王国的文明源远流长,博大精 ...
- Python - Python算法之冒泡算法的超简单实现
[原创]转载请注明作者Johnthegreat和本文链接 冒泡排序在算法中算是最简单也最容易实现的,这里介绍一个非常简单实现的代码: def bubble_sort(ls): for first in ...
- Springboot:员工管理之公共页面提取 高亮显示(十(5))
把顶部和左侧的公共代码分别放到header.html和left.html中 顶部代码:resources\templates\header.html 主内容展示: <!DOCTYPE html& ...