写在前面
今天写一个冒泡排序,当然网上冒泡排序已经写烂了,那博主我能和他们一样吗?为什么写这个呢?因为面试的时候很多时候都会问,但是又要自己显得和别人不一样,所以今天我们写的一个优化的冒泡,提升一下他的排序的性能。
基础写法
当然优化的前提是你的基础写法是对的才可以,所以我们写一个基本的冒泡排序
图解(白嫖的图)
基础写法代码实现
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,看起来是不是很微小,但是要明白这个数据会对着数据量的增加而变得明显的,喜欢的可以关注一下!拜拜喽![本来想写一些有质量的文章,没想到又水了一篇 😂]