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 相关文章推荐
JQuery实现简单时尚快捷的气泡提示插件
Dec 20 Javascript
防止xss和sql注入:JS特殊字符过滤正则
Apr 18 Javascript
js实现网页自动刷新可制作节日倒计时效果
May 27 Javascript
javascript图片预加载实例分析
Jul 16 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
Aug 25 Javascript
原生javascript移动端滑动banner效果
Mar 10 Javascript
js 获取今天以及过去日期
Apr 11 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
May 24 Javascript
vuejs事件中心管理组件间的通信详解
Aug 09 Javascript
浅谈Vue下使用百度地图的简易方法
Mar 23 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
Nov 26 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
Feb 28 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开发过程中关于继承的使用方法分享
2011/06/17 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
Grunt入门教程(自动任务运行器)
2015/08/06 Javascript
基于javascript实现checkbox复选框实例代码
2016/01/28 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
在axios中使用params传参的时候传入数组的方法
2018/09/25 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
vue在路由中验证token是否存在的简单实现
2019/11/11 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python中字符串的处理技巧分享
2016/09/17 Python
关于Django外键赋值问题详解
2017/08/13 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
2019/02/13 Python
python中树与树的表示知识点总结
2019/09/14 Python
python读取Kafka实例
2019/12/23 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
行政总经理岗位职责
2013/12/05 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
python - timeit 时间模块
2021/04/06 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python