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中使用了document和window哪些属性和方法小结
Sep 13 Javascript
jquery跟js初始化加载的多种方法及区别介绍
Apr 02 Javascript
利用js实现禁止复制文本信息
Jun 03 Javascript
jquery做个日期选择适用于手机端示例
Jan 10 Javascript
js实现楼层导航功能
Feb 23 Javascript
详解利用jsx写vue组件的方法示例
Jul 17 Javascript
JavaScript中数组常见操作技巧
Sep 01 Javascript
深入理解Vue 的条件渲染和列表渲染
Sep 01 Javascript
完美解决linux下node.js全局模块找不到的情况
May 16 Javascript
VUE 实现复制内容到剪贴板的两种方法
Apr 24 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 Javascript
layui内置模块layim发送图片添加加载动画的方法
Sep 23 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数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
php引用返回与取消引用的详解
2013/06/08 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
降低PHP Redis内存占用
2017/03/23 PHP
php传值方式和ajax的验证功能
2017/03/27 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
总结一些js自定义的函数
2006/08/05 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
jQuery实现对网页节点的增删改查功能示例
2017/09/18 jQuery
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
在Python的Django框架中编写编译函数
2015/07/20 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
Linux机考试题
2015/10/16 面试题
什么是抽象
2015/12/13 面试题
总裁办公室主任职责
2014/01/02 职场文书
电子银行营销方案
2014/02/22 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
护士节策划方案
2014/05/19 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
2014年残联工作总结
2014/11/21 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
python3.9之你应该知道的新特性详解
2021/04/29 Python