原生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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WIN32 API获取窗口句柄

    WIN32 API获取窗口句柄WIN32API获取窗口句柄2008-08-1305:28P.M. 关于如何获取窗口句柄,以及有哪些函数可供使用的简单讨论!首先罗列出一些获取句柄的win32api函数,然后简单说说他们的用途!最后说说是怎么理解和应用的。可用的win32api函数: 1.HWNDFindWindow(LPCTSTRlpClassName,L

    2022年7月21日
    10
  • scp和rsync命令[通俗易懂]

    scp和rsync命令[通俗易懂]SCP命令(1)scp定义scp可以实现服务器与服务器之间的数据拷贝。(fromserver1toserver2)(2)基本语法scp-r$pdir/$fname$user@$host:$pdir/$fname命令递归要拷贝的文件路径/名称目的地用户@主机:目的地路径/名称(3)基本示例scp-rjdk1.8.0_291/root@hadoop103:opt/modulescp-rroot@hadoop102:/opt/module/*root@h

    2022年8月30日
    1
  • IDEA2021.5 激活码[在线序列号]

    IDEA2021.5 激活码[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    49
  • scala 隐式转换

    scala 隐式转换文章目录作用解决什么问题使用implicits的一些规则3.1.1标记规则3.1.2范围规则3.1.3一次规则3.1.4优先规则3.1.5命名规则3.1.6编译器使用implicit的几种情况3.2隐含类型转换3.3转换被方法调用的对象3.3.1支持新的类型3.3.2模拟新的语法结构实验总结implicit基本含义隐式转换隐式转换的另一个优点是它们支持目标类型转换.隐式转换操作规则隐式参数和spring的依赖注入之前关系与区别隐式转换类(ImplicitClasses)隐式类

    2022年10月11日
    0
  • ctk加载插件「建议收藏」

    ctk加载插件「建议收藏」用ctk加载插件有两种方法,第一种需要自己创建ctkPluginFramework://ctkpluginctkPluginFrameworkFactory*ctkFrameWorkFactory=newctkPluginFrameworkFactory;QSharedPointerframework=ctkFrameWorkFactory->getFram

    2022年6月6日
    32
  • dsp调音软件通用吗_交叉火力dsp调音数据下载

    dsp调音软件通用吗_交叉火力dsp调音数据下载18。为什么在CCS下编译工具工作不正常?在CCS下有部分客户会碰到编译工具工作不正常,常见错误为:1)autoexec.bat的路径“outofmemory”。修改autoexec.bat,清除无用的PATH路径。2)编译的输出文件(OUT文件)写保护,无法覆盖。删除或修改输出文件的属性。3)Windows有问题。重新安装windows。4)Windows下有程序对CCS有影响。建议用一…

    2022年9月7日
    0

发表回复

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

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