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

其实在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);

讲解:将重复的数组 切割,拆分到最后只剩下一个数据或或者两个数组,将左边的数据放到结果里面,右边重复的跳过 不重复插入,直到循环完,返回结果就可以

时间: 2024-10-27 08:03:50

js算法中的排序、数组去重详细概述_javascript技巧的相关文章

javascript数组去重方法汇总_javascript技巧

javascript数组去重方法汇总 Array.prototype.unique1 = function () { var n = []; //一个新的临时数组 for (var i = 0; i < this.length; i++) //遍历当前数组 { //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (n.indexOf(this[i]) == -1) n.push(this[i]); } return n; }; Array.pro

JavaScript常见的五种数组去重的方式_javascript技巧

大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN]; 第一种 思路:建立一个临时数组,用for循环去依次判断arr中的每个项在临时数组中是否有相同的值,如果没有则将这个值添加到临时数组,如果有相同的值则不添加,最后返回这个临时数组 代码: Array.prototype.removeDuplicate = function(){ var n = []; for

javascript数组去重方法分析_javascript技巧

本文实例讲述了javascript数组去重方法.分享给大家供大家参考,具体如下: 方法一. 思路:创建一个新的空数组,循环遍历旧数组,用indexOf()方法,可以取得元素在数组中的位置,如果值为-1表示不存在.那么新数组用indexOf去获取老数组的每一个元素,如果值为-1表示不存在,就把他push到新数组里,最后输出新数组即去重后的数组 var arr=[24,56,74,89,24,56,78,09,24]; var new_arr=[]; for(var i=0;i<arr.length

js中apply方法的使用详细解析_javascript技巧

1.对象的继承,一般的做法是复制:Object.extendprototype.js的实现方式是: 复制代码 代码如下: Object.extend = function(destination, source) {     for (property in source) {         destination[property] = source[property];     }     return destination; } 除此之外,还有种方法,就是:Function.apply

js优化针对IE6.0起作用(详细整理)_javascript技巧

js优化针对IE6.0起作用,总结一下几点: 一,字符串拼接:用数组拼接 复制代码 代码如下: function func2(){ var start = new Date().getTime(); var array = []; for(var i = 0; i < 10000; i++){ array[i] = "<input type='button' value='a'>"; } 二,for 循环:先把长度算出来直接调用 复制代码 代码如下: function

Javascript中克隆一个数组的实现代码_javascript技巧

08年一家公司JS面试题,职位是javascript工程师(赴google) 面试官问我如何克隆一个数组,当时想了下js的Object没有clone方法,java的Object有. 那怎么得到一个新数组呢? 我当时回答:用一个loop将源数组元素依次push到新数组中.这是最简单的方法,但显然不是面试官想要的答案. 最后告知我:利用Array的slice方法.示例如下: 复制代码 代码如下: var ary = [1,2,3];//源数组 var ary2 = ary.slice(0);//克隆

js内存泄露的几种情况详细探讨_javascript技巧

内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束.在C++中,因为是手动管理内存,内存泄露是经常出现的事情.而现在流行的C#和Java等语言采用了自动垃圾回收方法管理内存,正常使用的情况下几乎不会发生内存泄露.浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露. 1.当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露. 复制代码 代码如下: <div id="

js鼠标及对象坐标控制属性详细解析_javascript技巧

offsetTop获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算顶端位置. offsetLeft获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置. offsetHeight获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度.IE.Opera 认为 offsetHeight = clientHeight + 滚动条 + 边框.NS.FF 认为 offsetHeight 是网页内容实际高度,可以小于 clientH

JavaScript中的console.profile()函数详细介绍_javascript技巧

编写JavaScript程序时,如果需要知道某段代码的执行时间,可以使用console.time().不过,在分析逻辑较为复杂的JavaScript程序,试图从中找出性能瓶颈的时候,console.time()就不适用了 - 深入分析逻辑较为复杂的JavaScript程序的运行就意味着插入大量的console.time()语句,而这无疑是不可接受的.对于复杂逻辑的JavaScript程序调优,正确的方法是使用console.profile(). 浏览器支持 安装了Firebug插件的Firefo