原生js数组排序

原生js数组排序原生js数组排序js排序以正序为例(即由小到大)vararr=[0,2,1,4,3,9,6,5,7,8];//未排序的数组varsortArr=null;//排序后得到的数组1sort排序sortArr=arr.sort(function(a,b){ returna-b})sort是es3增加的数组方法,大家可以放心使用(支持到ie…

大家好,又见面了,我是你们的朋友全栈君。

原生js数组排序

js 排序 以正序为例(即由小到大)

var arr = [0,2,1,4,3,9,6,5,7,8];  // 未排序的数组
var sortArr = null;  // 排序后得到的数组

1 sort排序

sortArr = arr.sort(function (a,b) {
	return a - b 
})

sort是es3增加的数组方法,大家可以放心使用(支持到ie6),但是数组在原数组上进行排序,不生成副本。这个时候我们的sortArr === arr是同一个数组

2 普通for循环排序

function sort (arr) {
	var newArr = [arr[0]];
	var nl = newArr.length;
	var ol = arr.length;
	for (var i = 1; i <= ol - 1; i++) {
		nl = newArr.length;
		for (var j = 0;  j <= nl - 1; j++) {
			if(newArr[j]>=arr[i]){
				newArr.splice(j, 0, arr[i]);
				break;
			}else if(j == nl - 1){
				newArr.push(arr[i])
			}
		}
	}
	return newArr;
}
sortArr = sort(arr);

*此方法会重新生成一个数组,并对其进行排序,但是缺点是执行效率低,当数据量较大时,*强烈不建议使用此方法

3 二分法排序

function twoSort (arr) {
	var len = arr.length;
	var left = 0, right = 0, point = 0;   //定义三个标记位,point就是最中间的位置
	var nArr = [];
	nArr[0] = arr[0];         //定义一个数组后,把arr中第一个数先赋给nArr
	for(var i=1; i<len; i++){
		left = 0;
		var nLen = nArr.length;
		right = nLen;
		for(var j=0; j<nLen; j++){
			point = Math.floor((left + right)/2);   //取整
				if(nArr[point] < arr[i]){
					left = point + 1;          //注意必须加1
				}else{
					right = point;
				}
			if(right == left){        //如果right和left相等就表示找到了插入的位置 ,插入后,跳出循环
				nArr.splice(left,0,arr[i]);
				break;
			}
		}
	}
	return nArr;
}
sortArr = sort(arr);

此方法会重新生成一个数组,并对其进行排序,并且执行效率较高,但是代码量比较大,对于我们这种爱研(de)究(se)的同学来说是不会满足于此的。

4 递归二分法排序的两种写法

法1

function recursiveSort1(arr) {
	if (arr.length <= 1) { return arr; }//如果输入数组长度小于等于1,直接返回数组。这也是递归算法的终结部分
		var base = Math.floor(arr.length / 2);//找到中间的基准元素位置
		var baseEle = arr.splice(base, 1)[0];//把基准元素从arr中摘除
		var left = [];
		var right = [];
	for (var i = 0; i < arr.length; i++) {
		if (arr[i] < baseEle) {
			left.push(arr[i]);
		} else {
			right.push(arr[i]);
		}
	}
	return recursiveSort(left).concat([baseEle ], recursiveSort(right));
	//返回递归左右两个部分concat中间元素,这就是结果
};
sortArr = recursiveSort1(arr);

法2

function recursiveSort2(arr) {
	if (arr.length <= 1) { return arr; }//如果输入数组长度小于等于1,直接返回数组。这也是递归算法的终结部分
		var base = Math.floor(arr.length / 2);//找到中间的基准元素位置
		var baseEle = arr[base];//把基准元素从arr中取出
		var left = [];
		var right = [];
	for (var i = 0; i < arr.length; i++) {
		if (i === base) continue;
		if (arr[i] < baseEle) {
			left.push(arr[i]);
		} else {
			right.push(arr[i]);
		}
	}
	return recursiveSort(left).concat([baseEle ], recursiveSort(right));
	//返回递归左右两个部分concat中间元素,这就是结果
};
sortArr = recursiveSort1(arr);

这两种方法会重新生成一个数组,并对其进行排序,并且执行效率较高,代码量比较小。但是法1会改变原数组(剔除原数组中间的一个元素),法2会保留原数组

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131369.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Redis

    Redis

    2021年3月12日
    158
  • 查询mysql版本号命令_怎么看自己mysql是哪个版本

    查询mysql版本号命令_怎么看自己mysql是哪个版本mysql>selectversion();+————+|version()|+————+|5.7.23-log|+————+1rowinset(0.12sec)转载于:https://www.cnblogs.com/IT-Crowd/p/10626783.html

    2022年10月6日
    0
  • 大数据中数据采集的几种方式

    大数据中数据采集的几种方式一、采集大数据的方法1.1通过系统日志采集大数据用于系统日志采集的工具,目前使用最广泛的有:Hadoop的Chukwa、ApacheFlumeAFacebook的Scribe和LinkedIn的Kafka等。这里主要学习Flume。Flume是一个高可靠的分布式采集、聚合和传输系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据,同时对数据进行简单处理,并写到诸如文本、HDFS…

    2022年5月20日
    66
  • js对象动态增加属性_js对象添加数据

    js对象动态增加属性_js对象添加数据varobj={};for(vari=0;i<10;i++){eval("obj.p"+i+"="+i);}

    2025年7月6日
    1
  • System.Runtime.InteropServices.COMException (0x8000401A): Retrieving the COM class factory for compo…

    System.Runtime.InteropServices.COMException (0x8000401A): Retrieving the COM class factory for compo…这个问题困扰了我很久,在网上找了很多资料都没用,最后找到解决方案:运行dcomcnfg打开组件服务,依次展开"组件服务"-&gt;"计算机"-&gt;"我的电脑"-&gt;"DCOM配置"找到"MicrosoftExcel应用程序"或"MicrosoftWord应用程序",右键打开属性对话框,点击"标识"选项卡,点&q

    2022年7月25日
    6
  • gitlab与github区别_gitlab和github账号互通么

    gitlab与github区别_gitlab和github账号互通么最近写项目不用svn也不用github了,而是用gitlab,其实和github使用方法一样,不过操作界面比github更丰富,功能更多……然后我们用的阿里云的代码管理正是gitlab,创建我们公司的私有项目!那么讲讲github和gitlab的区别。GitLab:利用RubyonRail开发的开源应用程序,实现一个自托管的Git项目仓库,可以通过web界面进行访问公开的或者私人项目。RubyonRail是一个使你开发、部署、维护web应用程序变得简单的框架。GitLab拥有与GitHub

    2022年10月22日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号