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实现x秒后自动跳转到一个页面
Jan 03 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
Jan 04 Javascript
JS cookie中文乱码解决方法
Jan 28 Javascript
javascript模拟post提交隐藏地址栏的参数
Sep 03 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
Sep 01 Javascript
JS实现很实用的对联广告代码(可自适应高度)
Sep 18 Javascript
javascript的列表切换【实现代码】
May 03 Javascript
微信小程序 devtool隐藏的秘密
Jan 21 Javascript
详解webpack 多入口配置
Jun 16 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
Jul 10 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
Sep 28 Javascript
详解vue中移动端自适应方案
May 05 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
Apache服务器无法使用的解决方法
2013/05/08 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
ThinkPHP提交表单时默认自动转义的解决方法
2014/11/25 PHP
简单谈谈favicon
2015/06/10 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
js获取视频时长代码
2014/04/10 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
2017/05/21 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
Python的argparse库使用详解
2018/10/09 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
Django如何将URL映射到视图
2019/07/29 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
Pandora西班牙官方商店:PandoraShop.es
2020/10/05 全球购物
工商管理专业自荐信
2014/06/03 职场文书
爱国口号
2014/06/19 职场文书
房屋所有权证明
2014/10/20 职场文书
2016年12月份红领巾广播稿
2015/12/21 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
教你用Python matplotlib库制作简单的动画
2021/06/11 Python
javascript Number 与 Math对象的介绍
2021/11/17 Javascript
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
Redis 限流器
2022/05/15 Redis