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 相关文章推荐
什么是Node.js?Node.js详细介绍
Jun 01 Javascript
jQuery实现表格颜色交替显示的方法
Mar 09 Javascript
7个有用的jQuery代码片段分享
May 19 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
AngularJS ng-bind-template 指令详解
Jul 30 Javascript
js设置和获取自定义属性的方法
Oct 20 Javascript
JAVA Web实时消息后台服务器推送技术---GoEasy
Nov 04 Javascript
详解node nvm进行node多版本管理
Oct 21 Javascript
详解各版本React路由的跳转的方法
May 10 Javascript
JavaScript实现构造json数组的方法分析
Aug 17 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
Oct 31 Javascript
vue绑定数字类型 value为数字的实例
Aug 31 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 5.0对象模型深度探索之对象复制
2008/03/27 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
浅谈PHP中的
2016/04/23 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
JavaScript中Number.MAX_VALUE属性的使用方法
2015/06/04 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
JavaScript必知必会(二) null 和undefined
2016/06/08 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
浅谈React 服务器端渲染的使用
2018/05/08 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
小程序扫描普通链接二维码跳转小程序指定界面方法
2019/05/07 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
Python3并发写文件与Python对比
2019/11/20 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
BeautifulSoup中find和find_all的使用详解
2020/12/07 Python
纯CSS3+DIV实现小三角形边框效果的示例代码
2020/08/03 HTML / CSS
英国在线发型和美容产品商店:Beauty Cutie
2019/04/27 全球购物
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
小学新学期教师寄语
2014/01/18 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
普通党员对照检查材料
2014/08/28 职场文书
高一军训的心得体会
2014/09/01 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
暑假生活随笔
2015/08/15 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS