js实现排序(其他方法除快排)

sort()

sort((a,b)=>a-b)大于0 升序,sort((a,b)=>b-a)小于0 降序

// 特别的
var ar1=[2,4,6,8,1,3]
var ar2=[2,16,36,8,56]
ar1.sort()
ar2.sort()//这个方法值只能排序第一位数  也可以字符串进行排序
console.log(ar1)//[1,2,3,4,6,8]
console.log(ar2)//[16, 2, 36, 56, 8];	//把数组里面当成字符串处理

默认排序顺序是升序,将元素转换为字符串,然后比较其UTF-16代码单元值的序列

第一种为js原生,以下开始排序算法:
在这里插入图片描述

冒泡排序

每轮依次比较相邻两个数的大小,后面比前面小则交换

//冒泡 升序
			// - 思想:依次两两比较,如果后面小则交换位置
			let arr = [4,2,8,4,11,4,0];
			let temp = 0, isChange = 0;	//用于交换 和 是否发生置换
			for(let i=0; i<arr.length-1;i++){		//外层循环控制排序的趟数
				isChange = 0;	//优化,每比较一趟就重新初始化为0
				
				for(let j=0; j<arr.length-i-1; j++){	//一轮下来,保证最后一个最大;
					//j要从0不是i,因为第一位不是最小; 且长度每轮减一 进行优化
					if(arr[j] > arr[j+1]){		//两两比较,若前面大,则交换
						temp = arr[j];
						arr[j] = arr[j+1];
						arr[j+1] = temp;

						isChange = 1;	//优化,如果进到这里面了,说明发生置换了
					}
				}

				if (isChange === 0) {	//优化,如果比较完一趟没有发生置换,那么说明已经排好序了,不需要再执行下去了
					break;
				}
			}
			console.log(arr);

选择排序

依次找到剩余元素的最小值或者最大值,放置在末尾或者开头。
注意 :选择排序是时间复杂度上表现最稳定的算法之一,因为最快、最慢时间复杂度都是O(n²),用选择排序数据量越小越好。

插入排序

以第一个元素为有序数组,其后的元素通过再这个已有序的数组中找到合适的元素并插入。

希尔排序

通过某个增量 gap,将整个序列分给若干组,从后往前进行组内成员的比较和交换,随后逐步缩小增量至 1。希尔排序类似于插入排序,只是一开始向前移动的步数从 1 变成了 gap。

			let arr = [4,2,8,4,11,4,0];
			let len = arr.length;
			// 初始步数,为中间数
			let gap = parseInt(len / 2);	
			// 逐渐缩小步数
			while (gap) {
				// 从第gap个元素开始遍历
				for (let i = gap; i < len; i++) {
					// 逐步其和前面其他的组成员进行比较和交换
					for (let j = i - gap; j >= 0; j -= gap) {
						if (arr[j] > arr[j + gap]) {
							[arr[j], arr[j + gap]] = [arr[j + gap], arr[j]];	//两两交换
						} else {
							break;
						}
					}
				}
				gap = parseInt(gap / 2);
			}
			console.log(arr);

归并排序

递归将数组分为两个序列,有序合并这两个序列。作为一种典型的分治思想的算法应用,归并排序的实现由两种方法:

  1. 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法)。
  2. 自下而上的迭代。

堆排序

说到堆排序,首先需要了解一种数据结构——堆。堆是一种完全二叉树,这种结构通常可以用数组表示。在实际应用中,堆又可以分为最小堆和最大堆,两者的区别如下:

  • -max-heap property :对于所有除了根节点(root)的节点 i,A[Parent(i)]≥A[i]
  • -min-heap property :对于所有除了根节点(root)的节点 i,A[Parent(i)]≤A[i]

堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

  • 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列
  • 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列

计数排序

以数组元素值为键,出现次数为值存进一个临时数组,最后再遍历这个临时数组还原回原数组。因为 JavaScript 的数组下标是以字符串形式存储的,所以计数排序可以用来排列负数,但不可以排列小数。

桶排序

取 n 个桶,根据数组的最大值和最小值确认每个桶存放的数的区间,将数组元素插入到相应的桶里,最后再合并各个桶。

桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。

基数排序

使用十个桶 0-9,把每个数从低位到高位根据位数放到相应的桶里,以此循环最大值的位数次。但只能排列正整数,因为遇到负号和小数点无法进行比较。

参考:
https://juejin.cn/post/6844904039566540808
https://juejin.cn/post/6844903583301763085

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值