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 相关文章推荐
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
Feb 15 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
Dec 03 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
Sep 05 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
Oct 21 Javascript
同一个网页中实现多个JavaScript特效的方法
Feb 02 Javascript
微信小程序 Button 组件详解及简单实例
Jan 10 Javascript
原生javascript上传图片带进度条【实例分享】
Apr 06 Javascript
Windows上node.js的多版本管理工具用法实例分析
Nov 06 Javascript
Js和VUE实现跑马灯效果
May 25 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
Aug 13 Javascript
JavaScript中遍历的十种方法总结
Dec 15 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
php中Smarty模板初体验
2011/08/08 PHP
php addslashes及其他清除空格的方法是不安全的
2012/01/25 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
php删除文本文件中重复行的方法
2015/04/28 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
2017/12/28 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
Sasa莎莎海外旗舰店:香港莎莎美妆平台
2018/03/21 全球购物
内部类的定义、种类以及优点
2013/10/16 面试题
创业计划书的主要内容有哪些
2014/01/29 职场文书
初婚初育证明范本
2014/11/24 职场文书
售票员岗位职责
2015/02/15 职场文书
2015年采购员工作总结
2015/04/27 职场文书
运动会宣传稿100字
2015/07/23 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL