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


相关推荐

  • Python用subprocess的Popen来调用系统命令

    Python用subprocess的Popen来调用系统命令

    2021年12月14日
    45
  • csharp: 用Enterprise Library对象实体绑定数据

    csharp: 用Enterprise Library对象实体绑定数据EnterpriseLibrary: https://msdn.microsoft.com/en-us/library/ff648951.aspx//////是否存在该记录/////////publicboolExists(stringReportID){

    2022年10月20日
    3
  • uboot启动过程详解

    uboot启动过程详解

    2022年3月2日
    32
  • [Mysql] TIMESTAMPDIFF函数

    [Mysql] TIMESTAMPDIFF函数本文主要讲解 TIMESTAMPDIF 函数

    2025年10月21日
    5
  • 投影矩阵的计算_投影矩阵的几何意义

    投影矩阵的计算_投影矩阵的几何意义在进行迭代重建的过程中,我们首先需要求出投影矩阵之后才能进行其他后续的操作,在迭代重建中起到了基石的作用。并且在前面的文章中《迭代重建算法中投影矩阵的计算》已经给出了一种方法,但是我发现在程序的运行过程中存在一些未知的bug,导致程序在计算某些角度的投影矩阵时出现错误。由于一直没有找到出现bug的原因,因此我改变了计算思路,找到了下文中正确的计算方法。首先需要证明一条直线与一个正方形相交。假设一个正方形的左上角的顶点坐标为(xk,yk),那么其余三个点的坐标也就能够写出来…

    2022年10月4日
    2
  • vue入门教程(一)「建议收藏」

    vue入门教程(一)「建议收藏」1.vue简介1.1vue是什么官网:https://cn.vuejs.org/Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue也完全能够为复杂的单页应用提供驱动。1.2vue的特点1)遵循MVVM模式2)编码简洁,体积小,运行效率高,适合移动/PC端开发.

    2022年6月4日
    33

发表回复

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

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