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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序是一种常用的排序算法,它在性能上比冒泡排序和选择排序要好。快速排序不仅在实际应用被广泛使用,而且在前端面试也经常被提及。下面是一个用JavaScript实现快速排序的代码: ```javascript Array.prototype.quickSort = function() { const rec = (arr) => { if(arr.length <= 1) return arr; let left = []; let right = []; const base = arr < base) { left.push(arr[i]); } else { right.push(arr[i]); } } return [...rec(left), base, ...rec(right)]; } const res = rec(this); res.forEach((item, key) => { this[key = item; }); } const arr = [1, 5, 9, 3, 18, 6, 2, 7]; arr.quickSort(); console.log(arr); ``` 这段代码通过Array的原型链添加了一个quickSort方法,将快速排序算法应用于数组。具体实现思路如下: 1. 定义一个递归函数rec,用于对数组进行切割和排序。 2. 若数组长度小于等于1,则直接返回数组。 3. 设置左右两个空数组,取第一个元素为基准值base。 4. 遍历数组,将小于基准值的元素放入左数组,将大于等于基准值的元素放入右数组。 5. 递归调用rec函数对左右数组进行排序,并使用扩展运算符(...)将结果与基准值合并成一个新的数组。 6. 将排序后的结果覆盖原数组的元素。 7. 最后通过调用arr.quickSort()对数组进行快速排序,并输出结果。 这段代码的时间复杂度为O(n log n),其n是数组的长度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JavaScript实现快速排序算法](https://blog.csdn.net/Yolanda_NuoNuo/article/details/119243593)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Javascript快速排序算法详解](https://download.csdn.net/download/weixin_38614484/13608187)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值