冒泡排序的实现思路和优化方案

时间:2022-07-23
本文章向大家介绍冒泡排序的实现思路和优化方案,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

文章目录

写在前面

今天写一个冒泡排序,当然网上冒泡排序已经写烂了,那博主我能和他们一样吗?为什么写这个呢?因为面试的时候很多时候都会问,但是又要自己显得和别人不一样,所以今天我们写的一个优化的冒泡,提升一下他的排序的性能。

基础写法

当然优化的前提是你的基础写法是对的才可以,所以我们写一个基本的冒泡排序

图解(白嫖的图)
基础写法代码实现
 function _funMp(_dataArr) {
  	console.time()
  	if (_dataArr instanceof Array) {
  		for (let i = 1; i < arr.length; i++) {
  			for (let j = 0; j < arr.length; j++) {
  				if (arr[j] > arr[j + 1]) {
  					let temp = arr[j]
  					arr[j] = arr[j + 1] 
  					arr[j + 1] = temp
  				}
  			}
  		}
  	} else {
  		console.info("_dataArr is not Array")
  	}
  	console.timeEnd()
  	return _dataArr
  }

至于运行的结果你们自己去看吧!这里就不贴了

优化外层循环的写法

其实冒泡排序的一个原理就是从数组的第一个开始和第二个比较,然后将大的值“冒”上去,其实就是用一个第三方变量暂存,看基础写法也可以看得明白,那么其实我们是可以直接将每一次的比较进行判断,因为有的数组是有很多的重复值的,那么当遇到重复值的时候我们不进行比较,是不是可以提升速度呢?所以第一个性能优化的点就来了!记录下来两个值是不是需要比较,不需要比较的话直接跳出循序,默认的是需要比较的,外层的时候认为不需要比较,进去内层循环以后如果后一个值小于前一个值,那么是不相等的,是需要比较的,这个时候重置标识!代码如下:

外层循环优化代码实现
function _funMp(_dataArr) {
  	console.time()
  	let _ischange = true
  	if (_dataArr instanceof Array) {
  		for (let i = 1; i < arr.length; i++) {
  			if (!_ischange) {
  				break
  			}
  			_ischange = false
  			for (let j = 0; j < arr.length; j++) {
  				if (arr[j] > arr[j + 1]) {
  					_ischange = true
  					let temp = arr[j]
  					arr[j] = arr[j + 1] 
  					arr[j + 1] = temp
  				}
  			}
  		}
  	} else {
  		console.info("_dataArr is not Array")
  	}
  	console.timeEnd()
  	return _dataArr
  }

优化内层循环

我的想法是内层循环其实只能优化次数,首先我们知道js的双层for循环的时候是外层走一个,内层走一圈,那么这个时候我们其实可以记录外层当前的一个临界值,因为我们排序的话只要保证排过的是正确的顺序就可以了,至于后面的是不是对的,我们不用关心,因为后面还会排到这里其实就知道代码怎么写了!

内层循环优化代码实现
/**
 * @function _funMp 冒泡排序
 * @param {Array} _dataArr user提供的实参
 * @ischange 标记是否发生交互,如果不交互,不进行比较,优化性能
 * @_currLocal 记录临界值   将没有必要排序的后续操作停止比较,比较当前值前面的所有值
 */
function _funMp(_dataArr) {
		console.time()
		let _currLocal = _dataArr.length 
		let _ischange = true
		if (_dataArr instanceof Array) {
			for (let i = 1; i < arr.length; i++) {
				if (!_ischange) {
					break
				}
				_ischange = false
				let _currIndex = 0
				for (let j = 0; j < _currLocal; j++) {
					if (arr[j] > arr[j + 1]) {
						_ischange = true
						_currIndex = j  
						let temp = arr[j]
						arr[j] = arr[j + 1] 
						arr[j + 1] = temp
					}
				}
				_currLocal = _currIndex
			}
		} else {
			console.info("_dataArr is not Array")
		}
		console.timeEnd()
		return _dataArr
	}

其实数据量小的时候是看不出来三着的区别的,不过你们可以试一个一万的数据的,里面还有很多重复数据的那种数组,就可以看的出来三者性能上还是很大差别的,我测试的数据是3000条速度相差大概是4ms,看起来是不是很微小,但是要明白这个数据会对着数据量的增加而变得明显的,喜欢的可以关注一下!拜拜喽![本来想写一些有质量的文章,没想到又水了一篇 ?]