记录个人算法学习1:冒泡排序

74 阅读2分钟

概念

冒泡排序的核心思想是通过重复遍历待排序的数列,比较相邻的两个元素,如果它们的顺序错误(例如升序排列时前一个元素大于后一个元素),则交换它们的位置。这样,每一轮遍历都会将当前未排序部分的最大(或最小)元素“冒泡”到数列的末尾。

409143692e60d8809129eec5eaf6a985.gif

思路

第一步 先理解冒泡排序【重点】

顾名思义,冒泡排序就是像冒泡泡一样排序,在水塘中气泡是从塘底冒到湖面上的,应用到排序中就是一个元素慢慢的从左边移动到右边,或者从下面移动到上面,注意这个过程是渐进的,不是突然间的移动。在排序中就需要先对比第一个和第二个,然后再对比第二个和第三个以此类推。。。。

第二步 场景假设

符合这个场景的最容易理解的就是对一个数值类型的数组做排序,举个例子你有一个数组

[64, 34, 25, 12, 22, 90, 11]

然后用冒泡排序的思路去对它做排序,此时的思路是把大的值从左到右的移动过去(冒泡)

graph TD
初始数组[64, 34, 25, 12, 22, 90, 11] --> 从左到右对比6次把最大的放在最右侧 --> 得到[34, 25, 12, 22, 64, 11, 90] --> 从左到右再对比5次把第二大的值放在倒数第二个 --> 得[25, 12, 22, 34, 11, 64, 90] --> 以此类推 --> 最终[11, 12, 22, 25, 34, 64, 90]

为了方便理解我把在执行第一次循环时的逻辑放到了下面

  1. 比较 64 和 34,因为 64 > 34,所以交换它们的位置。数组变为 [34, 64, 25, 12, 22, 90, 11]
  2. 比较 64 和 25,因为 64 > 25,所以交换它们的位置。数组变为 [34, 25, 64, 12, 22, 90, 11]
  3. 比较 64 和 12,因为 64 > 12,所以交换它们的位置。数组变为 [34, 25, 12, 64, 22, 90, 11]
  4. 比较 64 和 22,因为 64 > 22,所以交换它们的位置。数组变为 [34, 25, 12, 22, 64, 90, 11]
  5. 比较 64 和 90,因为 64 < 90,所以不交换它们的位置。数组保持不变。
  6. 比较 90 和 11,因为 90 > 11,所以交换它们的位置。数组变为 [34, 25, 12, 22, 64, 11, 90]

第三步 代码实现

function bubbleSort(arr) {
  let n = arr.length;
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

// 测试代码
const arr = [64, 34, 25, 12, 22, 90, 11];
console.log("原数组:", arr);
console.log("排序后:", bubbleSort([...arr]));