Javascript排序算法之合并排序(归并排序)的2个例子


Posted in Javascript onApril 04, 2014

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

归并操作的过程如下:

1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
2.设定两个指针,最初位置分别为两个已经排序序列的起始位置
3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4.重复步骤3直到某一指针达到序列尾
5.将另一序列剩下的所有元素直接复制到合并序列尾

示例1:

/**
 * 合并操作(merge),也叫合并算法,指的是将两个已经排序的序列合并成一个序列的操作。
 * 合并排序算法依赖合并操作。
 *
 * 合并操作的过程如下:
 *
 * 1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
 * 2、设定两个指针,最初位置分别为两个已经排序序列的起始位置
 * 3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
 * 4、重复步骤3直到某一指针达到序列尾
 * 5、将另一序列剩下的所有元素直接复制到合并序列尾
 *
 */function mergeSort(items) {
    if (items.length < 2) {
        return items;
    }
    var middle = Math.floor(items.length / 2),
        left = items.slice(0, middle),
        right = items.slice(middle),
        params = merge(mergeSort(left), mergeSort(right));
    params.unshift(0, items.length);
    items.splice.apply(items, params);
    return items;
    function merge(left, right) {
        var result = [],
            il = 0,
            ir = 0;
        while (il < left.length && ir < right.length) {
            if (left[il] < right[ir]) {
                result.push(left[il++]);
            } else {
                result.push(right[ir++]);
            }
        }
        return result.concat(left.slice(il)) .concat(right.slice(ir));
    }
}
// test
var arr = [2, 1, 3, 12, 5, 66, 23, 87, 15, 32];
mergeSort(arr);

示例2:

<script type="text/javascript">
//document.write("----------归并排序-----复杂排序里唯一一个稳定的,时间复杂度为nlogn------<br />");
//var array = new Array(12, 25, 32, 16, 18, 27, 59, 69, 36);
var count = 0;
//调用排序方法进行排序
//mSort(array, array, 0, array.length - 1);
//source源数组
//dest目标数组
//s起始下标
//t目标下标
function mSort(source, dest, s, t) {
 var result = "";
 var m; //取中间值 var dest2 = new Array();
 if (s == t) {
   dest[s] = source[s];
    }
  else {
       m = Math.floor((s + t) / 2);
     mSort(source, dest2, s, m);
      mSort(source, dest2, m+1 , t);
       merge(dest2, dest, s, m, t);
      /* 输出结果 */
      result += "<br />第" + ++count + "遍排序的结果是:";
   for (var n = 0; n < dest.length; n++) {
          result+= array[n] + ",";
        }
     /* 输出结果结束 */
 }
 return result;
}
/* 输出结果结束 */
//将两个数组按照从小到大的顺序融合
//source原数组
//dest排序后的数组
//s第一个下标
//m第二个数组下表
//n总长度
function merge(source, dest, s, m, n) {
 for (var j = m+1, k = s; j <= n && s <= m; k++) {
   if (source[s] < source[j]) {
       dest[k] = source[s++];
     }
    else {
         dest[k] = source[j++];
       }
  }
 //将剩余排不完的有序数组加入到dest的末端
   if (s <= m) {
        for (var l = 0; l <= m - s; l++) {
         dest[k + l] = source[s+l];
      }
  }
 if (j <= n) {
      for (var l = 0; l <= n - j; l++) {
       dest[k + l] = source[j+l];
       }
 }
}
//document.write("<br /><br />")
</script>
Javascript 相关文章推荐
Javascript 网页黑白效果实现代码(兼容IE/FF等)
Apr 23 Javascript
js replace正则表达式应用案例讲解
Jan 17 Javascript
javascript解三阶幻方(九宫格)
Apr 22 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
May 28 Javascript
微信小程序 后台登录(非微信账号)实例详解
Mar 31 Javascript
jQuery插件开发发送短信倒计时功能代码
May 09 jQuery
JavaScript运动框架 多值运动(四)
May 18 Javascript
JS实现的计数排序与基数排序算法示例
Dec 04 Javascript
JS实现图片拖拽交换效果
Nov 30 Javascript
layer设置maxWidth及maxHeight解决方案
Jul 26 Javascript
vue开发移动端底部导航条功能
Apr 08 Javascript
JQuery记住用户名和密码的具体实现
Apr 04 #Javascript
JS根据变量保存方法名并执行方法示例
Apr 04 #Javascript
JavaScript制作的可折叠弹出式菜单示例
Apr 04 #Javascript
JavaScript排序算法之希尔排序的2个实例
Apr 04 #Javascript
JavaScript中的prototype.bind()方法介绍
Apr 04 #Javascript
jQuery使用ajaxSubmit()提交表单示例
Apr 04 #Javascript
深入理解javascript的执行顺序
Apr 04 #Javascript
You might like
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
Javascript 获取链接(url)参数的方法[正则与截取字符串]
2010/02/09 Javascript
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
Js点击弹出下拉菜单效果实例
2013/08/12 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
c#+jquery实现获取radio和checkbox的值
2020/09/12 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Python中的tuple元组详细介绍
2015/02/02 Python
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
python 匹配url中是否存在IP地址的方法
2018/06/04 Python
Python中交换两个元素的实现方法
2018/06/29 Python
python如何求解两数的最大公约数
2018/09/27 Python
Django框架视图介绍与使用详解
2019/07/18 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
Shell编程面试题
2016/05/29 面试题
销售业务员岗位职责
2014/01/29 职场文书
校车安全管理责任书
2015/05/11 职场文书
新员工辞职信范文
2015/05/12 职场文书
追悼会悼词大全
2015/06/23 职场文书
k8s部署redis cluster集群的实现
2021/06/24 Redis