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 相关文章推荐
用Javascript实现UTF8编码转换成gb2312编码
Dec 22 Javascript
javascript写的日历类(基于pj)
Dec 28 Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
JS实现匀速运动的代码实例
Nov 29 Javascript
node.js中的console.assert方法使用说明
Dec 10 Javascript
原生js和jQuery实现淡入淡出轮播效果
Dec 25 Javascript
深入解析ES6中的promise
Nov 08 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
May 17 Javascript
Vue动态修改网页标题的方法及遇到问题
Jun 09 Javascript
JS实现返回上一页并刷新页面的方法分析
Jul 16 Javascript
vue路由守卫及路由守卫无限循环问题详析
Sep 05 Javascript
vue+elementUI 实现内容区域高度自适应的示例
Sep 26 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
PHP实现百度人脸识别
2019/05/06 PHP
自定义Laravel (monolog)日志位置,并增加请求ID的实现
2019/10/17 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
jQuery 1.0.2
2006/10/11 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
多个js毫秒倒计时同时进行效果
2016/01/05 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
2017/10/14 jQuery
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
Moda Italia荷兰:意大利男士服装
2019/08/31 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
Java基础面试题
2014/07/19 面试题
出纳员的岗位职责
2014/02/22 职场文书
2014年端午节活动方案
2014/03/11 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
成绩报告单家长评语
2014/12/30 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
原告代理词范文
2015/05/25 职场文书
uniapp开发小程序的经验总结
2021/04/08 Javascript
教你nginx跳转配置的四种方式
2022/07/07 Servers