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 相关文章推荐
Array.prototype.slice.apply的使用方法
Mar 17 Javascript
JavaScript Accessor实现说明
Dec 06 Javascript
一些有用的JavaScript和jQuery的片段分享
Aug 23 Javascript
js兼容的placeholder属性详解
Aug 18 Javascript
node.js中的fs.symlink方法使用说明
Dec 15 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
js获取新浪天气接口的实现代码
Jun 06 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
Jan 19 Javascript
JavaScript条件判断_动力节点Java学院整理
Jun 26 Javascript
jQuery实现获取动态添加的标签对象示例
Jun 28 jQuery
浅析JS中什么是自定义react数据验证组件
Oct 19 Javascript
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
鼠标拖动实现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
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
让您的菜单不离网站
2006/10/03 Javascript
使用javascript访问XML数据的实例
2006/12/27 Javascript
JavaScript的eval JSON object问题
2009/11/15 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
js实现抽奖效果
2017/03/27 Javascript
利用js实现前后台传送Json的示例代码
2018/03/29 Javascript
Puppeteer 爬取动态生成的网页实战
2018/11/14 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
在Django的通用视图中处理Context的方法
2015/07/21 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
python使用matplotlib画饼状图
2018/09/25 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
Python文件读写常见用法总结
2019/02/22 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
Pytorch实现的手写数字mnist识别功能完整示例
2019/12/13 Python
python中count函数简单用法
2020/01/05 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
Python列表如何更新值
2020/05/27 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
Python 字符串池化的前提
2020/07/03 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
专业实习自我鉴定
2013/10/29 职场文书
查环查孕证明
2014/01/10 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
《跨越海峡的生命桥》教学反思
2016/02/18 职场文书
windows安装python超详细图文教程
2021/05/21 Python