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页面滚动浮动层智能定位实例代码
Aug 23 Javascript
javascript文件中引用依赖的js文件的方法
Mar 17 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
Aug 04 Javascript
jQuery实现带有洗牌效果的动画分页实例
Aug 31 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
Apr 11 Javascript
关于Vue Webpack2单元测试示例详解
Aug 14 Javascript
vue中锚点的三种方法
Jul 06 Javascript
JS实现动态生成html table表格的方法分析
Jul 11 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
Jul 25 Javascript
JavaScript实现构造json数组的方法分析
Aug 17 Javascript
vuex actions传递多参数的处理方法
Sep 18 Javascript
JS控制只能输入数字并且最多允许小数点两位
Nov 24 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 isset()与empty()的使用区别详解
2010/08/29 PHP
PHP开发需要注意的安全问题
2010/09/01 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
纯JS实现动态时间显示代码
2014/02/08 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
举例讲解JavaScript中关于对象操作的相关知识
2015/11/16 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
Vue表单实例代码
2016/09/05 Javascript
Vue.js 父子组件通讯开发实例
2016/09/06 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
jquery实现一个全局计时器(商城可用)
2017/06/30 jQuery
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
Mac 安装 nodejs方法(图文详细步骤)
2017/10/30 NodeJs
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
使用form-create动态生成vue自定义组件和嵌套表单组件
2019/01/18 Javascript
layui 实现table翻页滚动条位置保持不变的例子
2019/09/05 Javascript
JS实现多功能计算器
2020/10/28 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
用Python实现一个简单的线程池
2015/04/07 Python
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
django-初始配置(纯手写)详解
2019/07/30 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
python操作toml文件的示例代码
2020/11/27 Python
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
网络公司美工设计工作个人的自我评价
2013/11/03 职场文书
大学毕业自我鉴定范文
2014/02/03 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书