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 CheckBox全选方法代码附js checkbox全选反选代码
Jun 09 Javascript
给html超链接设置事件不使用href来完成跳
Apr 20 Javascript
JavaScript中的replace()方法使用详解
Jun 06 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
Dec 08 Javascript
在AngularJS框架中处理数据建模的方式解析
Mar 05 Javascript
Javascript 普通函数和构造函数的区别
Nov 05 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
Dec 13 Javascript
jQuery简易时光轴实现方法示例
Mar 13 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
Jun 28 Javascript
在Layui中实现开关按钮的效果实例
Sep 29 Javascript
vue封装swiper代码实例解析
Oct 08 Javascript
JS实现放烟花效果
Mar 10 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
咖啡是不是喝了会上瘾?咖啡是必须品吗!
2021/03/04 新手入门
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
javascript的变量、传值、传址、参数之间关系
2015/07/26 Javascript
手机端实现Bootstrap简单图片轮播效果
2016/10/13 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
Angularjs 实现移动端在线测评效果(推荐)
2017/04/05 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
vue中使用rem布局代码详解
2019/10/30 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
老生常谈python之鸭子类和多态
2017/06/13 Python
Python编程之string相关操作实例详解
2017/07/22 Python
python中的字典操作及字典函数
2018/01/03 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
详解Python绘图Turtle库
2019/10/12 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
如何使用 Python 读取文件和照片的创建日期
2020/09/05 Python
详解如何解决canvas图片getImageData,toDataURL跨域问题
2018/09/17 HTML / CSS
捷克电器和DJ设备网上商店:Electronic-star
2017/07/18 全球购物
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
心得体会范文
2014/01/04 职场文书
2014年法院工作总结
2014/11/24 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
公司年夜饭通知
2015/04/25 职场文书
甲午风云观后感
2015/06/02 职场文书
火烧圆明园观后感
2015/06/03 职场文书
英镑符号 £
2022/02/17 杂记
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS