js 3种归并操作的实例代码


Posted in Javascript onOctober 30, 2013

第一种:

/**良哥的*/
function merge(a, b) {
    var aLen = a.length,
        bLen = b.length,
        maxLen = Math.max(aLen, bLen),
        sumLen = aLen + bLen,
        result = [],
        ap = 0,
        bp = 0;
     while (result.length < sumLen) {
        if (ap < aLen && bp < bLen) {
            if(a[ap] > b[bp]){
                result.push(b[bp++]);
            } else {
                result.push(a[ap++]);
            }
        } else if (!(ap < aLen)){
            while(bp < bLen){
                result.push(b[bp++]);
            }
        } else if (!(bp < bLen)){
            while(ap < aLen){
                result.push(a[ap++]);
            }
        }
    }
    return result;
}

第二种:

/**鲁军*/
function merge(arr1, arr2){    var i = 0;
    var j = 0;
    var c = 0;
    var k;
    var len1 = arr1.length;
    var len2 = arr2.length;
    var arr = [];
    for(;i<len1 && j<len2;){
        if( arr1[i] > arr2[j]  ){
            arr.push( arr2[j] );
            j++;
        }else{
            arr.push( arr1[i] );
            i++;
        }
        //if(i==len1 || j==len2){
        //    break;
        //}
    }
    if(i==len1){
        //arr = arr.concat(arr2.slice(j));
        for(k=j; k<len2; k++){
            arr.push( arr2[k] );
        }
    }
    if(j==len2){
        //arr = arr.concat(arr1.slice(i))
        for(k=i; k<len1; k++){
            arr.push( arr1[k] );
        }
    }
    return arr;
}

第三种:

/*金锐的*/
function merge(a,b){
    var x = 0;
    var l = 0;
    var list = [];
    var aLen = a.length;
    var bLen = b.length;    for(var i = 0; i < bLen; i++){
        for(var j = x; j < aLen; j++){
            if(b[i] < a[j]){
                list.push(b[i]);
                l = i;
                break;
            }else{                
                list.push(a[j]);
                x++;
            }
        }     
    }            

    if(x == a.length){
        for(var y = l; y < bLen; y++){
            list.push(b[y]);
        }
    }else{
        for(var z = x; z < aLen; z++){
            list.push(a[z]);
        }
    }
    return list;
}

经过测试2个有序20W长度的数组归并耗时都在15毫秒以下。

以下有几条经验(在大量操作的时候才能体现,平时不需要做这样的优化。代码可读性还是第一原则)

1:数组的concat方法比直接for循环push要慢。

2:for循环比while循环快。

3:var a = b || 3; //这种操作很消耗时间

4: break,continue 在已确定不需要再循环时很耗时。

Javascript 相关文章推荐
JavaScript 指导方针
Apr 05 Javascript
js如何取消事件冒泡
Sep 23 Javascript
js substring从右边获取指定长度字符串(示例代码)
Dec 23 Javascript
JavaScript弹窗基础篇
Apr 27 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
May 12 Javascript
利用ES6语法重构React组件详解
Mar 02 Javascript
Vue 仿QQ左滑删除组件功能
Mar 12 Javascript
详解如何构建Promise队列实现异步函数顺序执行
Oct 23 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
Oct 31 Javascript
使用Angular material主题定义自己的组件库的配色体系
Sep 04 Javascript
vue递归获取父元素的元素实例
Aug 07 Javascript
vue实现按钮切换图片
Jan 20 Vue.js
javascript获取选中的文本的方法代码
Oct 30 #Javascript
判断输入是否为空,获得输入类型的JS代码
Oct 30 #Javascript
js实现收缩菜单效果实例代码
Oct 30 #Javascript
比较新旧两个数组值得增加和删除的JS代码
Oct 30 #Javascript
利用javascript实现web页面中指定区域打印
Oct 30 #Javascript
javascript ajax 仿百度分页函数
Oct 29 #Javascript
JS禁用浏览器退格键实现思路及代码
Oct 29 #Javascript
You might like
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
javascript学习笔记(九) js对象 设计模式
2012/06/19 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
JS根据key值获取URL中的参数值及把URL的参数转换成json对象
2015/08/26 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
Vue.js划分组件的方法
2017/10/29 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
vuex的简单使用教程
2018/02/02 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
JavaScript async/await原理及实例解析
2020/12/02 Javascript
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
python解包概念及实例
2021/02/17 Python
python定义具名元组实例操作
2021/02/28 Python
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
教堂婚礼主持词
2014/03/14 职场文书
抽奖活动主持词
2014/03/31 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
体育节口号
2014/06/19 职场文书
商家认证委托书格式
2014/10/16 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
春节晚会开场白
2015/05/29 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android