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中对表单的基本操作代码
Jul 29 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
Apr 19 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
Jun 09 Javascript
jQuery UI插件自定义confirm确认框的方法
Mar 20 Javascript
jquery实现动静态条形统计图
Aug 17 Javascript
设置jQueryUI DatePicker默认语言为中文
Jun 04 Javascript
原生JS实现匀速图片轮播动画
Oct 18 Javascript
JS创建对象的写法示例
Nov 04 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
Dec 24 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
Sep 18 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
Nov 22 Javascript
微信小程序实现渐入渐出动画效果
Jun 13 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
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
php 中的4种标记风格介绍
2012/05/10 PHP
PHP实现链式操作的核心思想
2015/06/23 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
分享20多个很棒的jQuery 文件上传插件或教程
2011/09/04 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
Angularjs 创建可复用组件实例代码
2016/10/09 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
分数霸榜! python助你微信跳一跳拿高分
2018/01/08 Python
Python实现求数列和的方法示例
2018/01/12 Python
python爬虫基本知识
2018/03/05 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
HTML5 Canvas鼠标与键盘事件demo示例
2013/07/04 HTML / CSS
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
大学新生军训个人的自我评价
2013/10/03 职场文书
公司清洁工岗位职责
2013/12/14 职场文书
《长江之歌》教学反思
2014/04/17 职场文书
欢迎标语大全
2014/06/21 职场文书
毕业生工作求职信
2014/06/30 职场文书
怎样写家长意见
2015/06/04 职场文书