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获取元素文档大小、偏移和位置和滚动条位置的方法集合
Jan 12 Javascript
jQuery输入城市查看地图使用介绍
May 08 Javascript
推荐一款jQuery插件模板
Jan 09 Javascript
基于Javascript实现倒计时功能
Feb 22 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
Jul 01 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
微信小程序 textarea 详解及简单使用方法
Dec 05 Javascript
详解angularjs popup-table 弹出框表格指令
Sep 20 Javascript
JS实现的简单四则运算计算器功能示例
Sep 27 Javascript
vue+vue-validator 表单验证功能的实现代码
Nov 13 Javascript
Nuxt使用Vuex的方法示例
Sep 06 Javascript
Vue如何基于vue-i18n实现多国语言兼容
Jul 17 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读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
CheckBox多选取值及判断CheckBox选中是否为空的实例
2017/10/31 Javascript
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[02:16]2018年度CS GO最具人气选手-完美盛典
2018/12/16 DOTA
详细解析Python当中的数据类型和变量
2015/04/25 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
使用Django清空数据库并重新生成
2020/04/03 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
Python如何定义有默认参数的函数
2020/08/10 Python
全球最大的游戏市场:G2A
2018/07/05 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
党校培训思想汇报
2014/01/03 职场文书
咖啡书吧创业计划书
2014/01/13 职场文书
英语课外活动总结
2014/08/27 职场文书
党政领导班子四风问题对照检查材料思想汇报
2014/10/02 职场文书
校运会班级霸气口号
2015/12/24 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书