冒泡排序的实现思路和优化方案
文章目录
写在前面
今天写一个冒泡排序,当然网上冒泡排序已经写烂了,那博主我能和他们一样吗?为什么写这个呢?因为面试的时候很多时候都会问,但是又要自己显得和别人不一样,所以今天我们写的一个优化的冒泡,提升一下他的排序的性能。
基础写法
当然优化的前提是你的基础写法是对的才可以,所以我们写一个基本的冒泡排序
图解(白嫖的图)
基础写法代码实现
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,看起来是不是很微小,但是要明白这个数据会对着数据量的增加而变得明显的,喜欢的可以关注一下!拜拜喽![本来想写一些有质量的文章,没想到又水了一篇 ?]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- MySQL案例:binlog_row_image如何取舍
- “青柠日报”小程序
- 2020年学习Python-爬取英雄联盟皮肤
- R语言meta分析(10)功能强大的metafor
- Python保留字总结
- Python进阶 | 五分钟带你弄懂迭代器与生成器,夯实代码能力
- [Go]GO语言实战项目-gin框架上传图片文件
- [Go] Golang练习项目-GO语言实现选择排序
- 设计模式~策略模式
- Java单元测试框架(一)——JUnit4
- Java单元测试框架(二)——JUnit5
- 绘制双坐标轴图
- 用箭头和文字来标记重要的点
- 32.Python字符串方法split
- 程序员过关斩将--解决分布式session问题