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 中国省市两级联动选择附图
May 14 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
Oct 17 Javascript
JavaScript中字符串拼接的基本方法
Jul 07 Javascript
实现JavaScript的组成----BOM和DOM详解
May 18 Javascript
javascript小数精度丢失的完美解决方法
May 31 Javascript
JavaScript中获取时间的函数集
Aug 16 Javascript
Vue.js每天必学之方法与事件处理器
Sep 06 Javascript
jQuery简单获取DIV和A标签元素位置的方法
Feb 07 Javascript
react native 文字轮播的实现示例
Jul 27 Javascript
微信小程序实现页面浮动导航
Jan 08 Javascript
Angular单元测试之事件触发的实现
Jan 20 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
Oct 28 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开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
JQuery实现级联下拉框效果实例讲解
2015/09/17 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
关于微信小程序bug记录与解决方法
2018/08/15 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
layer.open弹层查看缩略图的原图,自适应大小的实例
2019/09/05 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
Django REST framework 分页的实现代码
2019/06/19 Python
pytz格式化北京时间多出6分钟问题的解决方法
2019/06/21 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
python range实例用法分享
2020/02/06 Python
Python hashlib模块的使用示例
2020/10/09 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
Oakley西班牙官方商店:太阳眼镜和男女运动服
2019/04/26 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
土木工程专业大学毕业生求职信
2013/10/13 职场文书
新闻系毕业生推荐信
2013/11/16 职场文书
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
学雷锋倡议书
2015/01/19 职场文书
党风廉政承诺书2016
2016/03/25 职场文书
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
为自由献出你的心脏!「进击的巨人展 FINAL」2022年6月在台开展
2022/04/13 日漫