js算法中的排序、数组去重详细概述


Posted in Javascript onOctober 14, 2013

其实在js中实现数组排序,采用数组中sort方法实现还是比较简单的:

一、排序

简单实现数组排序

var arr = [];  
for(var i=0;i<20;i++){  
    arr.push(Math.floor(Math.random()*100))  
}  
arr.sort(function(a,b){  
    return a>b?1:-1;  
})  
alert(arr)

不能简单使用sort方法,默认情况下 sort方法是按ascii字母顺序排序的,而非我们认为是按数字大小排序,

sort() 方法可以接受一个 方法为参数 ,这个方法有两个参数。分别代表每次排序比较时的两个数组项。sort()排序时每次比较两个数组项都回执行这个参数,并把两个比较的数组

项作为参数传递给这个函数。当函数返回值为1的时候就交换两个数组项的顺序,否则就不交换。

算法的数组排序

var arr = [];  
for(var i=0;i<20;i++){  
    arr.push(Math.floor(Math.random()*100))  
}  
//生成一个无序的arr数组  
function sort(arr,start,end){  
    //数组长度为1  
    if(start == end ){  
        return [arr[start]]  
    }else if(start == end-1){  
        //数组长度为2,根据数值大小 来排序  
        if(arr[start]>arr[end]){  
            return [arr[end],arr[start]]  
        }else{  
            return [arr[start],arr[end]]  
        }  
    }  
    // 数组长度一半  
    var l = Math.floor((start+end)/2);  
    //左边数组  
    var arrLeft = sort(arr, start,l);  
    //右边数组  
    var arrRight = sort(arr,l+1,end);  
    //返回结果  
    var result = [];  
    //分割成两部分 左右两个数组 只比对数组中的第一个数,那个数值小就把谁放到结果里面,并把小的数值删除掉,固采用数组中的shift方法。一旦出现左边数组或右边数组,没有数据的时候  
    //result数组就与还有数据的数组合并 采用 concat,并返回结果  
    while(arrLeft.length>0 || arrRight.length>0){  
        if(arrLeft.length==0){  
            result = result.concat(arrRight);  
            break;  
        }else if(arrRight.length==0){  
            result = result.concat(arrLeft);  
            break;  
        }  
        if(arrLeft[0]<arrRight[0]){  
            result.push(arrLeft.shift())  
        }else{  
            result.push(arrRight.shift());  
        }  
    }  
    return result;  
}  
var arrSort = sort(arr,0,arr.length-1);//参数 数组,开始位置,结束位置  document.write(arr+'<br/>'+arrSort);

讲解:数组排序主要是采用将数组一拆为二,直到不能为之,最后只能是拆掉数组里面只能是一个或者是两个,因为数组的长度有奇数偶数之分,拆到最后 数组里面只有一个或者两个之后 开始排序并返回结果,并将这些结果在一一比对 进行合并。这个方法 可能大家觉得 为什么要这么复杂,一直采用第一种不行吗,其实当然可以啦,但是这个世界上还有性能这个词汇,当数据之后几个 几十个 几个百 ,大家的算出的结果时间是没有什么区别的 ,如果当数据庞大的几亿 几十亿 我们还有这种自信用第一种方法吗,其实js的算法就是分而治之,将很多问题划分成小的来解决。

二、数组去掉重复

简单方法去掉重复:先声明一个空的数组,将重复的数组 for 循环插入,重复的跳过 不重复的插入

var arr = [];  
for(var i=0;i<20;i++){  
    arr.push(parseInt(Math.random()*10));  
}  
Array.prototype.indexOf = function(n){  
    for(var i=0;i<this.length;i++){  
        if(this[i] == n){  
            return i;  
        }  
    }  
    return -1;  
}  
function removeDup(arr){  
    var result = [];  
    for(var i=0;i<arr.length;i++){  
        if(result.indexOf(arr[i]) == -1){              result.push(arr[i]);  
        }  
    }  
    return result;   
}  
var arr2 = removeDup(arr)  
document.write(arr+'<br/>'+arr2)

算法数组去掉重复
var arr = [];  
for(var i=0;i<20;i++){  
    arr.push(parseInt(Math.random()*10));  
}  
Array.prototype.indexOf = function(n){  
    for(var i=0;i<this.length;i++){  
        if(this[i] == n){  
            return i;  
        }  
    }  
    return -1;  
}  
function removeDup(arr,s,e){  
    if(s==e){  
        //分割就剩下一个  
        return [arr[s]]  
    }else if(s==e-1){  
        //为了优化 剩下两个就不用分割啦  
        if(arr[s]==arr[e]){  
            return [arr[s]]  
        }else{  
            return [arr[s],arr[e]];  
        }  
    }  
    //数组平分成两段,  
    var l = Math.floor((s+e)/2);  
    //左边  
    var arrL = removeDup(arr,s,l);  
    //右边  
    var arrR = removeDup(arr,l+1,e);  
    //结果 先把左边的复制进去  
    var result = arrL;  
    //循环 将不重复的数据插入到结果里面  
    for(var i=0;i<arrR.length;i++){  
        if(result.indexOf(arrR[i])== -1 ) result.push(arrR[i])  
    }  
    return result; //返回结果  
}  
var arrDup = removeDup(arr, 0, arr.length-1);  
document.write(arr+'<br/>'+arrDup);

讲解:将重复的数组 切割,拆分到最后只剩下一个数据或或者两个数组,将左边的数据放到结果里面,右边重复的跳过 不重复插入,直到循环完,返回结果就可以
Javascript 相关文章推荐
Javascript insertAfter() 实现函数代码
Oct 12 Javascript
情人节之礼 js项链效果
Feb 13 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
May 24 Javascript
如何使用AngularJs打造权限管理系统【简易型】
May 09 Javascript
值得分享的轻量级Bootstrap Table表格插件
May 30 Javascript
JS控制层作圆周运动的方法
Jun 20 Javascript
onmouseover事件和onmouseout事件全面理解
Aug 15 Javascript
AngulerJS学习之按需动态加载文件
Feb 13 Javascript
VSCode配置react开发环境的步骤
Dec 27 Javascript
vue中使用gojs/jointjs的示例代码
Aug 24 Javascript
JS前后端实现身份证号验证代码解析
Jul 23 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
Sep 25 Javascript
鼠标拖动实现DIV排序示例代码
Oct 14 #Javascript
不同Jquery版本引发的问题解决
Oct 14 #Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
Oct 14 #Javascript
javascript预加载图片、css、js的方法示例介绍
Oct 14 #Javascript
js获取或设置当前窗口url参数的小例子
Oct 14 #Javascript
几种延迟加载JS代码的方法加快网页的访问速度
Oct 12 #Javascript
JavaScript如何从listbox里同时删除多个项目
Oct 12 #Javascript
You might like
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
php生成图片验证码的方法
2016/04/15 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
使用js获取地址栏中传递的值
2013/07/02 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
JavaScript之数组(Array)详解
2015/04/01 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
详解vuex的简单使用
2018/03/12 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
深入了解Vue动态组件和异步组件
2021/01/26 Vue.js
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
详解FireFox下Canvas使用图像合成绘制SVG的Bug
2019/07/10 HTML / CSS
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
百货商场楼层班组长竞聘书
2014/03/31 职场文书
保护环境建议书100字
2014/05/13 职场文书
服装设计专业求职信
2014/06/16 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
选调生挂职锻炼工作总结
2015/10/23 职场文书
手残删除python之后的补救方法
2021/06/26 Python
Golang并发操作中常见的读写锁详析
2021/08/30 Golang