JavaScript 数组排序【六大方法】「建议收藏」

JavaScript 数组排序【六大方法】「建议收藏」文章目录数组排序sort()方法冒泡排序选择排序插入排序快速排序希尔排序数组排序排序,就是把一个乱序的数组,通过我们的处理,让他变成一个有序的数组1.sort()方法sort()数组对象排序其原理是冒泡排序reverse()方法能够颠倒数组元素的排列顺序例如:vararr=[3,1,5,6,4,9,7,2,8];varasc=arr.sort()console.log(asc); //1,2,3,4,5,6,7,8,9vardesc=asc.

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

文章目录

数组排序

  1. sort()方法
  2. 冒泡排序
  3. 选择排序
  4. 插入排序
  5. 快速排序
  6. 希尔排序

数组排序

排序,就是把一个乱序的数组,通过我们的处理,让他变成一个有序的数组

1. sort()方法

sort() 数组对象排序 其原理是冒泡排序
reverse() 方法能够颠倒数组元素的排列顺序
例如:

var arr = [3,1,5,6,4,9,7,2,8];
var asc = arr.sort()
console.log(asc);	// 1,2,3,4,5,6,7,8,9
var desc = asc.reverse()
console.log(desc);	// 9,8,7,6,5,4,3,2,1

2. 冒泡排序

先遍历数组,让挨着的两个进行比较,如果前一个比后一个大,那么就把两个换个位置
数组遍历一遍以后,那么最后一个数字就是最大的那个了
然后进行第二遍的遍历,还是按照之前的规则,第二大的数字就会跑到倒数第二的位置
依次类推,最后就会按照顺序把数组排好了
进行排序:

var arr = [5,4,3,2,1];
console.log('初始数组:',arr);	// 5,4,3,2,1
//一次次遍历,有多少个数就遍历多少次
for(var i = 0; i < arr.length; i++){ 
   
	//循环两两比较数组中的数字
	for(var j = 0; j < arr.length; j++){ 
   
		//if判断,如果数组中的当前一个比后一个大,那么两个交换一下位置
		if(arr[j] > arr[j + 1]){ 
   
			var tmp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = tmp;
			console.log('i='+i,arr);
		}
	}
}
console.log('排序结束:',arr);	// 1,2,3,4,5

在这里插入图片描述

优化代码:

var arr = [5,4,3,2,1];
console.log('初始数组:',arr);	// 5,4,3,2,1
/*数组长度为9,在第8次的时候,后面8个数字已经排序好 了,最小的数字已经交换到第1个数字位置,所以没必要再 一次从第1个开始进行两两交换比较了,即:arr.length-1*/
for (let i = 0; i < arr.length-1; i++){ 
   
	/*每次循环的时候都会把最后一个数字依次排在最后 面,循环了几次,意味着后面已经排好了几个数,而 那些已经排好的数也没必要再跟没排好的数进行比较 即:数组长度length-已经循环的次数i*/
	for (let j = 0; j < arr.length - 1 - i; j++){ 
   
		if(arr[j] > arr[j + 1]){ 
   
			let tmp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = tmp;
			console.log('i='+i,arr);
		}
	}
}
console.log('排序结束:',arr);	// 1,2,3,4,5

3. 选择排序

先假定数组中的第 0 个就是最小的数字的索引
然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引
知道数组遍历结束后,就能找到最小的那个索引,然后让最小的索引换到第 0 个位置
再来第二遍遍历,假定第 1 个是最小的数字的索引
在遍历一次数组,找到比我小的那个数字索引
遍历结束后换个位置
以此类推,就能把数组排序好了
进行排序

var arr = [3,1,5,2,4];
console.log('初始数组:',arr);	// 3,1,5,2,4
for(let i = 0; i< arr.length; i++){ 
   
	/*假定第 1 遍数组中的第 0 个是最小数字的索引 第 2 遍的时候假定第 1 个,即假定第 i 个就行*/
	let minIndex = i;
	/*因为之前已经把最小的放在最前面了,后面的循环 就不需要判断前面的了,直接从i+1开始*/
	for(let j = i+1; j < arr.length; j++){ 
   
		if(arr[j] < arr[minIndex]){ 
   
			minIndex = j;
		}
	}
	/*遍历结束后找到最小的索引 第 1 趟的时候是和第 0 个交换,第 2 趟的时候和 第 1 个交换,即直接和第 i 个交换就行 */
	let tmp = arr[minIndex];
	arr[minIndex] = arr[i];
	arr[i] = tmp;
	console.log('i='+i,arr);
}
console.log('排序结束:',arr);	// 1,2,3,4,5

在这里插入图片描述

优化代码

var arr = [3,1,5,2,4];
console.log('初始数组:',arr);	// 3,1,5,2,4
/*和之前一样,倒数第二次排序完毕以后,就已经排好了,最后一次没有必要了*/
for(let i = 0; i< arr.length-1; i++){ 
   
	/*假定第 1 遍数组中的第 0 个是最小数字的索引 第 2 遍的时候假定第 1 个,即假定第 i 个就行*/
	let minIndex = i;
	for(let j = i+1; j < arr.length; j++){ 
   
		if(arr[j] < arr[minIndex]){ 
   
			minIndex = j;
		}
	}
	/*遍历结束后找到最小的索引 第 1 趟的时候是和第 0 个交换,第 2 趟的时候和 第 1 个交换,即直接和第 i 个交换就行 */
	let tmp = arr[minIndex];
	arr[minIndex] = arr[i];
	arr[i] = tmp;
	console.log('i='+i,arr);
}
console.log(arr);	// 1,2,3,4,5

4. 插入排序

假设前面 n-1 的元素已经排好序,将第n个元素插入到前面已经排好的序列中。

var arr = [5,4,3,2,1];
console.log('初始数组:',arr);	// 5,4,3,2,1
for(var i = 0; i < arr.length; i++) { 
   	
	for(var n = i; n >= 0; n--) { 
   
		if(arr[n] > arr[n+1]){ 
   
			var temp = arr[n];
			arr[n] = arr[n+1];
			arr[n+1] = temp;
			console.log('i='+i,arr);		
		}	
 	}
}
console.log('排序结束:',arr);	// 1,2,3,4,5

在这里插入图片描述

5. 快速排序

快速排序 :冒泡排序的改进算法。
设定分界值,根据分界值将数组分为左右两部分。其中一部分的所有数据都比另外一部分的所有数据都比另一部分的所有数据小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

var arr = [3,1,5,2,4];
console.log('初始数组:',arr);	// 3,1,5,2,4
var sum = 0;
function quickSort (arr) { 
   
    if (arr.length <= 1) { 
   
        return arr;
    }
    var medianIndex = Math.floor(arr.length / 2); // 找分界值索引
    var medianValue = arr.splice(medianIndex, 1); // 把分界值从原数组中取出并删除
    var left = []; 	// 比分界值小的,放左边
    var right = [];	// 比分界值大的,放右边
    for (let i = 0; i < arr.length; i++) { 
   
        if (arr[i] < medianValue) { 
   
            left.push(arr[i])
        } else { 
   
            right.push(arr[i])
        }
        sum++;
    }
    console.log(medianIndex, medianValue, left, right)
    return quickSort(left).concat(medianValue,quickSort(right));	// 最后进行拼接
};
console.log('排序结束:',quickSort(arr));	// 1,2,3,4,5

在这里插入图片描述

6. 希尔排序

希尔排序 :插入排序的改进算法。
把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个数据列恰好被分成一组,算法便终止。

var arr = [3,1,5,2,4];
console.log('初始数组:',arr);	// 3,1,5,2,4
var sum = 0;
// var fraction = Math.floor(arr.length / 2) => 定义间隔区间
// fraction = Math.floor(fraction / 2) => 循环中不断切割区间
for (var fraction = Math.floor(arr.length / 2); fraction > 0; fraction = Math.floor(fraction / 2)) { 
   
	// 以间隔值开始遍历
	for (var i = fraction; i < arr.length; i++) { 
   
		// 如果前面一个大于后面一个
		for (var j = i - fraction; j >= 0 && arr[j] > arr[fraction + j]; j -= fraction) { 
   
			var temp = arr[j];
			arr[j] = arr[fraction + j]; // 后移
			arr[fraction + j] = temp; // 填补
			console.log('i='+i,arr);	
			sum++;
		}
	}
}
console.log('排序结束:',arr);	// 1,2,3,4,5

在这里插入图片描述

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

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

(0)
上一篇 2022年6月12日 下午9:36
下一篇 2022年6月12日 下午9:46


相关推荐

  • 嵌入式工程师岗位要求_fae和研发哪个工资高

    嵌入式工程师岗位要求_fae和研发哪个工资高FAE,嵌入式行业苦涩的职位FAE,也叫现场技术支持工程师大学招聘季的时候,憨娃娃一个,一心想找个嵌入式的职位,幻想着成为IronMan,左焊电路,右敲代码,打造属于自己的一身铁皮,成为村里走出去最科技的那个仔。现在想来,着实可笑了些。佩剑尚未佩好,出门就掉巨坑。“你要去的部门是我们公司最核心的部门,我们公司的主营业务都在那边。”HR的自豪我现在竟然还记得。“看起来我还是蛮优秀的嘛。”…

    2025年7月15日
    6
  • 9. 数仓开发之 DWD 层

    9. 数仓开发之 DWD 层数仓开发之DWD层交易域加购事务事实表DWD层设计要点:DWD层的设计依据:维度建模理论,该层存储维度模型的事实表DWD层的数据存储格式:orc列式存储+snappy压缩DWD层表名的命名规范:dwd_数据域_表名_单分区增量****全量标识(inc/full)交易域加购事务事实表…

    2022年6月26日
    40
  • 如何查看自己idea的激活码【2021最新】

    (如何查看自己idea的激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1…

    2022年3月30日
    657
  • 大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?

    大一新生应该如何学习C语言,书上代码看不懂理解不了怎么办?大家好,我是二哥呀!昨天有个读者问我要C语言的学习路线,他今年刚上大一,书上的代码完全看不懂。讲真,大一新生,一般都是零基础的纯小白,看不懂书上的代码很正常,除非是小学、初中、高中就开始卷计算机的硬核少年;或者是因为教材选的有问题。那刚好二哥之前整理过一些学习C语言的资料和学习方法,今天趁这个机会就再做个汇总和梳理。推荐一本书,两门视频课,若干学习建议,看完后如果还看不懂、理解不了C语言,过来骂我、捶我,只要不要打脸就行。01)阮一峰老师的C语言入门教程这个教程是开源的,采用知识共享许可

    2022年6月11日
    36
  • 做10年Windows程序员与做10年Linux程序员的区别

    如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序,同样是工作10年,大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大。我写这篇文章

    2021年12月27日
    38
  • Spring整合Hibernate的步骤

    Spring整合Hibernate的步骤

    2021年12月6日
    43

发表回复

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

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