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事件串连执行多个处理过程的方法
Mar 09 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
Jan 07 Javascript
改变javascript函数内部this指针指向的三种方法
Apr 23 Javascript
jquery解决图片路径不存在执行替换路径
Feb 06 Javascript
用于deeplink的js方法(判断手机是否安装app)
Apr 02 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
May 14 Javascript
js 左右悬浮对联广告代码示例
Dec 12 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
May 24 Javascript
js制作网站首页图片轮播特效代码
Aug 30 Javascript
JS常用函数和常用技巧小结
Oct 15 Javascript
简单学习5种处理Vue.js异常的方法
Jun 17 Javascript
jQuery带控制按钮轮播图插件
Jul 31 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 彩色文字实现代码
2009/06/29 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
PHP微信分享开发详解
2017/01/14 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
javascript中的3种继承实现方法
2016/01/27 Javascript
JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法
2016/04/18 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
Vue函数式组件的应用实例详解
2019/08/30 Javascript
20多个小事例带你重温ES10新特性(小结)
2019/09/29 Javascript
python新手经常遇到的17个错误分析
2014/07/30 Python
Python中的super用法详解
2015/05/28 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
2020/12/08 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
工程地质勘察专业大学生求职信
2013/10/13 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
使用Ajax实现无刷新上传文件
2022/04/12 Javascript