算法描述

  1. 比较相邻的元素,如果前面的数大于后面的元素,则交换两个数的位置。第一次遍历后,最大的数会被放到数组的最后位置,即 array[length - 1]。
  2. 第二次遍历时跳过最后一个元素,因为该元素通过第一次遍历已经确定是最大值。
  3. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

动图演示

v2-33a947c71ad62b254cab62e5364d2813_b.webp

算法实现

这里需要注意的是两层循环的边界。
第一层循环因为是两两比较,所以最后一个元素已经和前一个元素比较过了,所以就没必要遍历了,所以第一层循环 i < arr.length - 1
第二层循环中,后面的 i 个元素已经为排序好的元素了,所以也没必要再遍历了,所以第二层循环 j < arr.length - 1 - i

  1. /**
  2. * 交换数组中的两个元素
  3. * @param {number[]} arr
  4. * @param {number} i
  5. * @param {number} j
  6. */
  7. const swap = (arr, i, j) => {
  8. const temp = arr[i]
  9. arr[i] = arr[j]
  10. arr[j] = temp
  11. }
  12. /**
  13. * 冒泡排序
  14. * @param {number[]} arr 数值数组
  15. */
  16. const bubbleSort = (arr) => {
  17. for (let i = 0; i < arr.length - 1; i++) {
  18. for (let j = 0; j < arr.length - 1 - i; j++) {
  19. if (arr[j] > arr[j + 1]) {
  20. swap(arr, j, j + 1)
  21. }
  22. }
  23. }
  24. return arr
  25. }

这里的时间复杂度为 o(n^2)