js有序数组的连接问题


Posted in Javascript onOctober 01, 2013

1.前言 

昨天碰到一道关于如何解决有序数组的连接问题,这是一个很常见的问题。但是这里要考虑到代码的效率问题,因为要连接的数组都是有序的,这是一个非常重要的前提条件。

2.简单但效率不高的算法 

 我首先想到的是使用内置的concat方法,然后再对其进行排序,这种方法完全没有考虑到数组是有序的前提条件,代码如下:    

function concatSort(arrA,arrB){ 
     return arrA.concat(arrB).sort(); 
}

为了弄清楚sort排序到底使用的是什么算法,特地到看了V8引擎的算法(连接),大概意思是当数组的长度较短的时候使用的是插入排序(InsertionSort),当数组的长度较长的时候使用的是快速排序(QuickSort)。纠正了自己长时间来的一个误区,一直以为sort使用的是冒泡。

3. 取小值插入的方法 

 大概思路:就是同时对两个数组进行遍历,设置两个标志(i,j)用于记录遍历的位置,将两个数组中较小的那个值插入新数组中,接着再将标志往前移动一个位置,重复比较,直到搜索值都插入到数组中。第一次做的时候判断条件写错了,所以出现了死循环,暴露了自己算法能力还是挺薄弱的。     

function con(arrA,arrB){ 
   var i , j , k, lenA = arrA.length, lenB = arrB.length , allLen = lenA + lenB,result = []; 
   for(i=0,j=0,k =0; k < allLen; k++ ){ 
       if(i < lenA &&(j >= lenB || arrA[i] < arrB[j])){ 
           result.push(arrA[i++]);  
       }else{ 
            result.push(arrB[j++]); 
       } 
   } 
   return result; 
} 
var a = [1,2,4], b = [3,5,6,7,10]; 
console.log(con(a,b));  //[1,2,3,4,5,6,7,10]

将这个算法与上面的方法1,在jsperf进行性能对比,发现第二种算法的效率明显优于第一种。不相信就猛击这里。

4.问题升级:增加合并数组的数量

  假如增加数组的个数,;例如 A = [1,5],B = [2,6],C = [3,4].......K = [....],求合并的数组。   

     当时被问到这个问题,第一感觉就是很像”归并算法“,但是又一想使用归并算法是用不上数组有序这个前提条件的。接着又想到了堆排序、快排序等算法,发现就是无法很有效地用上数组有序这个前提条件,最后选择放弃。面试完后依然没有思路,想了好久不知道如何高效的解决这个问题。快回宿舍的时候,师弟说了一句”又要过节了“,”又“字点醒了我,代码如下:   

function conMore(){ 
    var outerArr = [], i ,len = arguments.length , result = []; 
    for(i = 0 ; i<len; i++){ 
        outerArr.push(arguments[i]); 
    } 
    if(result.length === 0){ 
        result = outerArr[0]; 
    } 
    for(i=1 ;i< len; i++){ 
        result = con(result,outerArr[i]); 
    } 
    return result; 
} 
function con(arrA,arrB){ 
   var i , j , k, lenA = arrA.length, lenB = arrB.length , allLen = lenA + lenB,result = []; 
   for(i=0,j=0,k =0; k < allLen; k++ ){ 
       if(i < lenA &&(j >= lenB || arrA[i] < arrB[j])){ 
           result.push(arrA[i++]);  
       }else{ 
            result.push(arrB[j++]); 
       } 
   } 
   return result; 
} 
var a = [1,4,7], b = [2,5,8], c = [3,6,9,10]; 
console.log(conMore(a,b,c));   //[1,2,3,4,5,6,7,8,9,10]

再次使用jsperf对代码的性能进行测试分析,结果请猛击这里.

Javascript 相关文章推荐
基于jquery的15款幻灯片插件
Apr 10 Javascript
读jQuery之九 一些瑕疵说明
Jun 21 Javascript
js console.log打印对像与数组用法详解
Jan 21 Javascript
JS传值出现中文参数乱码的解决方法
Jun 30 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
Sep 27 Javascript
基于javascript实现按圆形排列DIV元素(三)
Dec 02 Javascript
js遍历json的key和value的实例
Jan 22 Javascript
jQuery使用方法
Feb 04 Javascript
微信小程序中button组件的边框设置的实例详解
Sep 27 Javascript
详解Vue2 添加对scss的支持
Jan 02 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
ES6基础之字符串和函数的拓展详解
Aug 22 Javascript
jquery更换文章内容与改变字体大小代码
Sep 30 #Javascript
jquery配合css简单实现返回顶部效果
Sep 30 #Javascript
jquery提取元素里的纯文本不包含span等里的内容
Sep 30 #Javascript
jquery得到font-size属性值实现代码
Sep 30 #Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
Sep 30 #Javascript
js防止表单重复提交的两种方法
Sep 30 #Javascript
js借助ActiveXObject实现创建文件
Sep 29 #Javascript
You might like
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
谨慎使用PHP的引用原因分析
2012/09/06 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
php实现的xml操作类
2016/01/15 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
JavaScript 密码强度判断代码
2009/09/05 Javascript
jqgrid 简单学习笔记
2011/05/03 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
JS实现的RC4加密算法示例
2018/08/16 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
Python基于Tkinter实现的记事本实例
2015/06/17 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
Python配置文件处理的方法教程
2019/08/29 Python
python3.7 openpyxl 删除指定一列或者一行的代码
2019/10/08 Python
Java提供了哪些企业应用编程接口
2015/02/13 面试题
师范应届毕业生自荐信
2013/11/18 职场文书
校园安全广播稿
2014/02/08 职场文书
小班幼儿评语大全
2014/04/30 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
离婚起诉书范本
2015/05/18 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
中秋节作文(五年级)之关于月亮
2019/09/11 职场文书
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫