【前端】【面试题】JS实现冒泡排序

前言

本文主要介绍冒泡排序,包含详细注释和优化:

原理

冒泡排序是通过重复遍历要排序的列表,比较相邻的元素,如果顺序错误就交换它们,直到没有需要交换的元素为止。这样每次遍历都会把最大的元素“冒泡”到末尾。

实现示例

function bubbleSort(arr) {
  const n = arr.length;
  let swapped; // 用于优化:标记是否发生交换

  // 外层循环控制遍历次数(每次遍历会确定一个最大值到末尾)
  for (let i = 0; i < n - 1; i++) {
    swapped = false;

    // 内层循环比较相邻元素,每轮遍历可以减少比较次数(因为末尾已排序)
    for (let j = 0; j < n - 1 - i; j++) {
      // 如果前一个元素比后一个大,交换它们的位置
      if (arr[j] > arr[j + 1]) {
        // 使用解构赋值进行交换(无需临时变量)
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        swapped = true;
      }
    }

    // 优化:如果本轮未发生交换,说明已完全有序,提前终止排序
    if (!swapped) break;
  }

  return arr;
}

// 示例使用
const unsortedArray = [64, 34, 25, 12, 22, 11, 90];
console.log("排序前:", unsortedArray);
console.log("排序后:", bubbleSort(unsortedArray));

代码解析

  1. 外层循环:控制遍历次数(n-1次),每次遍历会将未排序部分的最大值"冒泡"到正确位置
  2. 内层循环
    • 比较相邻元素 arr[j]arr[j+1]
    • 使用解构赋值 [a, b] = [b, a] 高效交换元素
    • 每轮遍历减少比较次数(n-1-i),因为末尾已排序部分无需再比较
  3. 优化标记
    • swapped 变量检测本轮是否发生交换
    • 如果未发生交换,说明数组已完全有序,提前终止排序。这样可以减少不必要的比较,提升性能。

时间复杂度

场景时间复杂度
最好情况(已排序)O(n)
平均情况O(n²)
最坏情况O(n²)

执行示例

输入:

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

输出:

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

关键点总结

  • 冒泡排序是稳定的排序算法(相同值元素相对位置不变)
  • 空间复杂度为 O(1)(原地排序)
  • 实际开发中效率较低,适用于教学或小规模数据排序
  • 对比其他排序算法:快速排序 平均 O(n log n),更高效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是程序媛lisa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值