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 相关文章推荐
图片按比例缩放函数
Jun 26 Javascript
jQuery中slice()方法用法实例
Jan 07 Javascript
JavaScript实现找质数代码分享
Mar 24 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
Jun 21 Javascript
详细总结Javascript中的焦点管理
Sep 17 Javascript
jQuery实现鼠标经过显示动画边框特效
Mar 24 jQuery
详解angularjs中的隔离作用域理解以及绑定策略
May 31 Javascript
利用vue组件自定义v-model实现一个Tab组件方法示例
Dec 06 Javascript
Javascript删除数组里的某个元素
Feb 28 Javascript
layui radio单选限制下一个radio单选的实例
Sep 03 Javascript
浅谈layui 数据表格前后台传值的问题
Sep 12 Javascript
JavaScript原始值与包装对象的详细介绍
May 11 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中的实现trim函数代码
2007/03/19 PHP
smarty内部日期函数html_select_date()用法实例分析
2015/07/08 PHP
显示、隐藏密码
2006/07/01 Javascript
JS模拟多线程
2007/02/07 Javascript
用javascript将数据库中的TEXT类型数据动态赋值到TEXTAREA中
2007/04/20 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
首页图片漂浮效果示例代码
2014/06/05 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
js重写方法的简单实现
2016/07/10 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
bootstrap学习使用(导航条、下拉菜单、轮播、栅格布局等)
2016/12/01 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
Vue.js仿Select下拉框效果
2020/02/18 Javascript
vue 自定义组件的写法与用法详解
2020/03/04 Javascript
Python 学习笔记
2008/12/27 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
python 反向输出字符串的方法
2018/07/16 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
Lookfantastic美国/加拿大:英国知名美妆购物网站
2019/03/27 全球购物
网吧消防安全制度
2014/01/28 职场文书
圣诞节红领巾广播稿
2014/02/03 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
演讲稿的写法
2014/05/19 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
2015年科室工作总结
2015/04/10 职场文书
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
2021/06/05 Python