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+XMLHttpRequest+asp.net无刷新读取数据库数据
Aug 09 Javascript
jquery form表单提交插件asp.net后台中文解码
Jun 12 Javascript
新鲜出炉的js tips提示效果
Apr 03 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
Aug 11 Javascript
JS实现输入框提示文字点击时消失效果
Jul 19 Javascript
JS实现中国公民身份证号码有效性验证
Feb 20 Javascript
整理关于Bootstrap列表组的慕课笔记
Mar 29 Javascript
JS创建Tag标签的方法详解
Jun 09 Javascript
微信小程序 Buffer缓冲区的详解
Jul 06 Javascript
原生js检测页面加载完毕的实例
Sep 11 Javascript
轻松学习JavaScript函数中的 Rest 参数
May 30 Javascript
javascript数组元素删除方法delete和splice解析
Dec 09 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+mysql事务rollback&amp;commit示例
2010/02/08 PHP
PHP 动态随机生成验证码类代码
2010/04/09 PHP
php去除HTML标签实例
2013/11/06 PHP
JS中confirm,alert,prompt函数使用区别分析
2010/04/01 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
js实现键盘控制DIV移动的方法
2015/01/10 Javascript
jQuery ajax提交Form表单实例(附demo源码)
2016/04/06 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
基于模板引擎Jade的应用(详解)
2017/12/12 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
微信小程序实现多行文字超出部分省略号显示功能
2019/10/23 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
keras 多任务多loss实例
2020/06/22 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
生物制药专业自我鉴定
2014/02/19 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
教师工作总结范文2014
2014/11/10 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
人民的好儿女观后感
2015/06/18 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
Win10系统下配置Java环境变量
2021/06/13 Java/Android
如何在Python中妥善使用进度条详解
2022/04/05 Python
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android
JS实现简单九宫格抽奖
2022/06/28 Javascript