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 相关文章推荐
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
May 15 Javascript
javascript 函数调用的对象和方法
Jul 01 Javascript
javaScript如何处理从java后台返回的list
Apr 24 Javascript
jquery控制select的text/value值为选中状态
Jun 03 Javascript
JS在IE下缺少标识符的错误
Jul 23 Javascript
jquery处理页面弹出层查询数据等待操作实例
Mar 25 Javascript
JS控制表单提交的方法
Jul 09 Javascript
理解Javascript图片预加载
Feb 23 Javascript
jQuery实现无限往下滚动效果代码
Apr 16 Javascript
jQuery如何防止Ajax重复提交
Oct 14 Javascript
基于element-ui组件手动实现单选和上传功能
Dec 06 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
Jun 08 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的字符串用法小结
2010/06/08 PHP
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP Curl多线程原理实例详解
2013/11/06 PHP
php使用get_class_methods()函数获取分类的方法
2016/07/20 PHP
Ajax实现对静态页面的文章访问统计功能示例
2016/10/10 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
详解package.json版本号规则
2019/08/01 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
python如何读写json数据
2018/03/21 Python
python利用微信公众号实现报警功能
2018/06/10 Python
python3+requests接口自动化session操作方法
2018/10/13 Python
Python正则表达式和元字符详解
2018/11/29 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
Python class的继承方法代码实例
2020/02/14 Python
Python加速程序运行的方法
2020/07/29 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
python Selenium 库的使用技巧
2020/10/16 Python
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
造型师求职自荐信
2013/09/27 职场文书
护理职业生涯规划书
2014/01/24 职场文书
关于诚信的活动方案
2014/08/18 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
司机个人年终总结
2015/03/03 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang