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 相关文章推荐
事件委托与阻止冒泡阻止其父元素事件触发
Sep 02 Javascript
jquery插件unobtrusive实现片段式加载
Jun 15 Javascript
jQuery实现动画效果circle实例
Aug 06 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
Jul 14 Javascript
layer.open 按钮的点击事件关闭方法
Aug 17 Javascript
Vue.js实现的购物车功能详解
Jan 27 Javascript
详解vue使用$http服务端收不到参数
Apr 19 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
May 17 jQuery
gulp构建小程序的方法步骤
May 31 Javascript
JS开发自己的类库实例分析
Aug 28 Javascript
jquery实现穿梭框功能
Jan 19 jQuery
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中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
深入理解javascript中defer的作用
2013/12/11 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
2015/09/07 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python线程的两种编程方式
2015/04/14 Python
Python脚本判断 Linux 是否运行在虚拟机上
2015/04/25 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
python实现感知器
2017/12/19 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
python自动脚本的pyautogui入门学习
2020/04/01 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
iHerb中文官网:维生素、保健品和健康产品
2018/11/01 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
财务管理个人自荐书范文
2013/11/24 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
大班亲子运动会方案
2014/06/10 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
vue elementUI表格控制对应列
2022/04/13 Vue.js
德生TECSUN S-2000使用手册文字版
2022/05/10 无线电