算法基础之彻底理解冒泡排序及其深度优化

本文详细探讨冒泡排序这一基础算法,通过JavaScript实现,并逐步介绍如何进行第一层和第二层优化,降低时间复杂度,提高排序效率。在第一层优化中,利用标记判断数组是否已有序;第二层优化则通过记录上次交换位置,减少不必要的比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序

冒泡排序,作为最基础的算法之一,属于选择算法中的一种简单比较算法。其复杂度在最简单情况下为O(n), 最复杂情况下为O(n2),也常作为面试必考算法。本篇主要通过Javascript来实现冒泡排序以及其优化过程。
1、冒泡排序
	function popoSort(arr=[]){
		if(arr.length <= 0) {
			return arr;
		}
		const len = arr.length;
		for(let i = 0; i < len; i++){
			for(let j=i+1;j < len; j++){
			    // 如果前面的元素比后面的大,则交换元素,最终结果就是
				if(arr[j] > arr[i]){
					let temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
				}
			}
		}
		return arr;
	}
2、第一层优化

在上述算法中,如果在一次遍历中,发现元素没有进行交换了,那说明数组已然有序,这时候就无须做多余比较了。用一个标记去标记上一次遍历是否发生过交换,如果没有,那说明数组已经有序,则无需再遍历。

	function popoSort(arr=[]){
		if(arr.length <= 0) {
			return arr;
		}
		const len = arr.length;
		for(let i = 0; i < len; i++){
			let flag = 0;
			for(let j=i+1;j < len; j++){
			    // 如果前面的元素比后面的大,则交换元素,最终结果就是
				if(arr[j] > arr[i]){
					let temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
					flag = 1;
				}
			}
			if(flag === 0) {
				return arr;
			}
		}
		return arr;
	}
3、第二层优化

在第一次优化中,只是增加了数组有序条件的判定。其实在数组还未完全有序时,因为已经部分有序了,有些多余的比较也可省略,这里可以用一个temPosition记录上一次遍历交换的最后一个元素的索引。下次比较只需要到这次索引终止即可。

	function popoSort(arr=[]){
		if(arr.length <= 0) {
			return arr;
		}
		let len = arr.length ;
		let temPosition = 0;
		for(let i = 0; i < arr.length; i++){
			let flag = 0;
			for(let j=i+1;j < len; j++){
			    // 如果前面的元素比后面的大,则交换元素,最终结果就是
				if(arr[j] > arr[i]){
					let temp = arr[j];
					arr[j] = arr[i];
					arr[i] = temp;
					flag = 1;
					// 记录上一次遍历的位置
					temPosition = j;
				}
			}
			//len = temPosition;
			if(flag === 0) {
				return arr;
			}
		}
		return arr;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值