学习JavaScript排序算法-冒泡排序

435 阅读3分钟

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

上一篇文章学习了排序方法, 另更多更文学习 JavaScript 的系列更文及JavaScript排序算法小总结更多阅读-文末

本文来继续学习 JavaScript 中的排序方法: 在实际工作中经常用到排序算法 冒泡排序

JavaScript 排序算法-冒泡排序 bubbleSort

JavaScript 排序算法-冒泡排序-bubbleSort.gif

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。

通过重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

作为最简单的排序算法之一,冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。

bubbleSort 算法步骤

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

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)
}

更多阅读

经典排序算法: