这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战
上一篇文章学习了排序方法, 另更多更文学习 JavaScript 的系列更文及JavaScript排序算法小总结更多阅读-文末
本文来继续学习 JavaScript 中的排序方法: 在实际工作中经常用到排序算法 冒泡排序
JavaScript 排序算法-冒泡排序 bubbleSort
冒泡排序(Bubble Sort)也是一种简单直观的排序算法。
通过重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
作为最简单的排序算法之一,冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。
bubbleSort 算法步骤
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
JavaScript 代码实现:
function bubbleSort(arr) {
let len = arr.length
for (var i = 0; i < len - 1; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 相邻元素两两对比
let temp = arr[j + 1] // 元素交换
arr[j + 1] = arr[j]
arr[j] = temp
}
}
}
return arr
}
// 引入下面的 测试代码耗时的方法: 进行测试希尔排序对处理20000+条数据的排序耗时:
getFnRunTime(bubbleSort)
冒泡排序什么时候最慢
当输入的数据是反序时. 写一个 for 循环反序输出数据不就得了, 在干脆对于数组 直接 .reverse()岂不更方便...干嘛要用你冒泡排序呢?
冒泡排序什么时候最快
当输入的数据已经是正序时(都已经是正序了,还要你冒泡排序有何用啊)。
测试代码运行耗时的函数
const testArrFn = function () {
let arr = []
const count = 200000
for (let i = 0; i < count; i++) {
arr[i] = Math.floor(Math.random() * 50 + 1)
}
return arr
}
let testArr = testArrFn()
let len = testArr.length
/**
* @desc 测试函数执行的时间
*/
module.exports = async function getFnRunTime(fn) {
let startTime = Date.now(),
endTime
let result = await fn(testArr)
endTime = Date.now()
console.log(testArr, result)
console.log(`total time: ${endTime - startTime}ms, `, "test array'length: " + len, result.length)
}
更多阅读
- 【Array.prototype.map() 】、
- 【JS-特殊符号-位运算符】、
- 【ES6 - for/of】、
- 【JS-逻辑运算符-短路了?】、
- 【JavaScript-箭头函数】、
- 【JavaScript-forEach()】、
经典排序算法: