merge sort 的javascript实现
递归
上一篇blog里,用js实现了quicksort算法,quicksort算法是一个递归调用过程。
递归是一种非常强大的编程思想,它广泛的的存在于各种语言当中,尤其lisp的各种方言中,大量的使用递归来实现循环操作。
还有一本小书叫《The litter schemer》,就是让编程的人递归的思考问题(thinking recursively)。
本篇呈接上篇,是对递归思想的实践——在学习常见的算法的同时,运用递归思想。
理解了递归思想,以前觉得挺难的算法也觉得不是想象的那么难了。
mergsort in javascript
- 最简单的情况是对两个元素的数组排序;
- 如果两个数组已经排序好了,那么,再将这两个数组合并为一个有序的数组是比较容易的;
- 一个混乱的数组,总能将其分成两部分,再将分成的两部分再分为两部分,直到有一个部分只包含两个元素,那么就回到第1步的情况,对两个元素的数组进行排序;
- 这是一个递归过程
function first(l){
return l[0];
}
function rest(l){
return l.slice(1);
} /** 实现2
* l1 l2 是已经从小到大排序好的数组
* 返回一个l1 l2合并后的,从小到大排序好的数组
* */
function mergelist(l1,l2){
var ret
if(l1.length == 0){
ret = l2;
}else if(l2.length == 0){
ret = l1;
}else if(first(l1)>first(l2)){//将小的放前面
ret = [].concat(first(l2),
mergelist(l1,rest(l2)))
}else{
ret = [].concat(first(l1),//将小的元素放前面
mergelist(l2,rest(l1)))
}
return ret;
} // console.log(mergelist([2,3],[1,4,5]));
// console.log(mergelist([1,4,5],[2,3]));
// --> [ 1, 2, 3, 4, 5 ] // 下面这个操作是对一组数数组排序的最小单位排序操作——因为
// 一个包含任意元素的数组的排序最终都能逐渐的递归细分为比较两个元素的大小
// 切分操作由下面的divide函数来完成
// console.log(mergelist([5],[2]));
// --> [ 2, 5 ] // 实现3中的拆分
// 将一个数组分为两部分
function divide(l){
var len = l.length
, mid = Math.floor(len/2);
return [l.slice(0,mid),l.slice(mid,len)]
} // console.log(divide([1,4,5,2,3]));
//--> [ [ 1, 4 ], [ 5, 2, 3 ] ] // 整体实现
function mergesort(l1){
var ab = divide(l1)
, a = ab[0]
, b = ab[1]; if(a.length == 0){
return b;
}else if(b.length == 0){
return a;
}else if(a.length == 1){
return [].concat(mergelist(a,mergesort(b)));
}else if(b.length == 1){
return [].concat(mergelist(b,mergesort(a)));
}else{
return [].concat(mergelist(mergesort(a),
mergesort(b)));
}
} console.log(mergesort([5,2,3,4]));
console.log(mergesort([5,3,4]));
// console.log(mergesort([1,4,5,2,3])); // 注意[].concat方法的运用
// [].concat(1,[2,3]) -> [1,2,3]
// [].concat([1],[2,3]) -> [1,2,3]
// [].concat(1,2,3) -> [1,2,3]
merge sort 的javascript实现的更多相关文章
- [Algorithms] Divide and Recurse Over an Array with Merge Sort in JavaScript
Merge sort is a recursive sorting algorithm. If you don't understand recursion, I recommend finding ...
- Write a merge sort program
Merge Sort- Recursion Write a merge sort program in JavaScript. Sample array : [34, 7, 23, 32, 5, 62 ...
- 【算法】归并排序(Merge Sort)(五)
归并排序(Merge Sort) 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序 ...
- [算法]——归并排序(Merge Sort)
归并排序(Merge Sort)与快速排序思想类似:将待排序数据分成两部分,继续将两个子部分进行递归的归并排序:然后将已经有序的两个子部分进行合并,最终完成排序.其时间复杂度与快速排序均为O(nlog ...
- SQL Tuning 基础概述06 - 表的关联方式:Nested Loops Join,Merge Sort Join & Hash Join
nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制. 驱动表限制条件有索引,被驱动表连接条件有索引. hints:use_n ...
- 归并排序(Merge Sort)
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序 ...
- 归并排序(merge sort)
M erge sort is based on the divide-and-conquer paradigm. Its worst-case running time has a lower ord ...
- Summary: Merge Sort of Array && 求逆序对
常用算法(后面有inplace版本): package ArrayMergeSort; import java.util.Arrays; public class Solution { public ...
- 基础排序算法之并归排序(Merge Sort)
并归排序是学习分治法 (Merge Sort) 的好例子.而且它相对于选择,插入,冒泡排序来说,算法性能有一定提升.我首先会描述要解决的问题,并给出一个并归排序的例子.之后是算法的思路以及给出伪代码. ...
随机推荐
- UI“三重天”之selenium--常用API和问题处理(三)
Selenium常用API: 前面两篇示例代码中用到了一些selenium的API方法,例如定位元素的八种方法.访问url.等待.操作浏览器.获取title.点击.清理等等. 有关于selenium的 ...
- Building a Simple User Interface(创建一个简单的用户界面)
对于一个android 应用程序,用户的图形界面通常是由View(视图)和ViewGroup(视图组)对象构成的层次结构. View(视图)对象通常是按钮或文本输入框这类UI小部件,ViewGroup ...
- Xenu Link Sleuth 简单好用的链接测试工具 使用说明
XenuLink Sleuth 名词介绍 “Xenu链接检测侦探”是被广泛使用的死链接检测工具.可以检测到网页中的普通链接.图片.框架.插件.背景.样式表.脚本和java程序中的链接. 那么神马时候出 ...
- 20165233 实验二 Java面向对象程序设计
20165233 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...
- TCAM CAM 说明 原理 结构 Verilog 硬件实现
TCAM 三态内容地址查找存储器,CAM内容地址查找存储器.区别在于TCAM多了一级掩码功能,也就是说可以指定某几位是dont care.匹配的时候0,1都行的意思. 广泛应用于数据流处理领域,本文简 ...
- MultipartFile 转换为File
选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferto()方法 . MultipartFile multipartFile; File fil ...
- 创建标签的两种方法insertAdjacentHTML 和 createElement 创建标签 setAttribute 赋予标签类型 appendChild 插入标签
1. 建立字符串和insertAdjacentHTML('beforeEnd', ) 2. 通过createElement 创建标签 setAttribute 赋予标签类型 appendChild ...
- JS调用webservice的两种方式
协议肯定是使用http协议,因为soap协议本身也是基于http协议.期中第二种方式:只有webservice3.5以后版本才可以成功 第一种方式:构造soap格式的body,注意加粗的黄色标识,比如 ...
- matplotlib —— 添加文本信息(text)
[详细]http://hyry.dip.jp/tech/book/page/scipy/matplotlib_fast_plot.html http://blog.csdn.net/lanchunhu ...
- fixed语句
[fixed语句] fixed 语句禁止垃圾回收器重定位可移动的变量.fixed 语句只能出现在不安全的上下文中.Fixed 还可用于创建固定大小的缓冲区. fixed 语句设置指向托管变量的指针,并 ...