javascript 冒泡排序算法

137 阅读4分钟

当然可以,我会逐行解释 JavaScript 版冒泡排序的基本实现和优化版实现的代码逻辑。

基本版冒泡排序逐行解释

javascript
复制代码
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]) {
                // 交换元素
                let temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    // 返回排序后的数组
    return arr;
}

// 测试代码
let arr = [64, 34, 25, 12, 22, 11, 90];
// 调用 bubbleSort 函数对数组进行排序
let sortedArr = bubbleSort(arr);
// 输出排序后的数组
console.log("排序后的数组:", sortedArr);

代码逻辑解释

  1. function bubbleSort(arr) {
    定义一个名为 bubbleSort 的函数,该函数接受一个数组 arr 作为参数。
  2. let n = arr.length;
    获取数组的长度,并将其存储在变量 n 中。这个值用于控制循环次数。
  3. for (let i = 0; i < n; i++) {
    开始外层循环,该循环从 0 开始,遍历整个数组。i 是循环计数器,用于控制内层循环的执行次数。随着每一轮排序完成,最后的元素会被放在正确的位置,因此不再需要对其进行比较。
  4. for (let j = 0; j < n - i - 1; j++) {
    内层循环用于比较相邻的元素。j 是循环计数器,它的范围是从 0n - i - 1n - i - 1 是为了在每轮排序时排除已经排序好的元素,减少不必要的比较。
  5. if (arr[j] > arr[j + 1]) {
    这是一个条件判断。如果当前元素 arr[j] 比下一个元素 arr[j + 1] 大,则需要交换它们的位置。
  6. let temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp;
    这三行代码用于交换两个元素的位置。首先,将 arr[j] 的值存储在临时变量 temp 中,然后将 arr[j + 1] 的值赋给 arr[j],最后将 temp 中的值赋给 arr[j + 1],完成交换。
  7. return arr;
    返回已经排序好的数组。
  8. let arr = [64, 34, 25, 12, 22, 11, 90];
    创建一个测试数组,包含无序的数字。
  9. let sortedArr = bubbleSort(arr);
    调用 bubbleSort 函数对数组进行排序,并将结果存储在 sortedArr 中。
  10. console.log("排序后的数组:", sortedArr);
    将排序后的数组输出到控制台。

优化版冒泡排序逐行解释

javascript
复制代码
function bubbleSortOptimized(arr) {
    // 获取数组的长度
    let n = arr.length;
    // 外层循环:遍历整个数组
    for (let i = 0; i < n; i++) {
        // 初始化 swapped 变量,用于检查是否发生过交换
        let swapped = false;
        // 内层循环:从头开始比较相邻的元素
        for (let j = 0; j < n - i - 1; j++) {
            // 如果当前元素比下一个元素大,则交换它们的位置
            if (arr[j] > arr[j + 1]) {
                let temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                // 标记已经发生交换
                swapped = true;
            }
        }
        // 如果在一轮比较中没有发生任何交换,提前结束排序
        if (!swapped) break;
    }
    // 返回排序后的数组
    return arr;
}

// 测试代码
let arr = [64, 34, 25, 12, 22, 11, 90];
// 调用 bubbleSortOptimized 函数对数组进行排序
let sortedArr = bubbleSortOptimized(arr);
// 输出排序后的数组
console.log("优化后的排序数组:", sortedArr);

代码逻辑解释

  1. function bubbleSortOptimized(arr) {
    定义一个名为 bubbleSortOptimized 的函数,接受一个数组 arr 作为参数。
  2. let n = arr.length;
    获取数组的长度,存储在 n 中。
  3. for (let i = 0; i < n; i++) {
    外层循环,从 0 开始遍历整个数组。
  4. let swapped = false;
    初始化一个布尔变量 swapped,用于标记在内层循环中是否发生了交换操作。
  5. for (let j = 0; j < n - i - 1; j++) {
    内层循环,用于比较相邻的元素。
  6. if (arr[j] > arr[j + 1]) {
    如果当前元素大于下一个元素,则需要交换它们的位置。
  7. let temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp;
    这三行代码用于交换两个元素的位置。
  8. swapped = true;
    swapped 设为 true,表示在这一轮比较中发生了交换。
  9. if (!swapped) break;
    检查 swapped 是否为 false。如果在内层循环中没有发生交换,说明数组已经有序,可以提前退出外层循环,节省不必要的比较。
  10. return arr;
    返回排序后的数组。
  11. let arr = [64, 34, 25, 12, 22, 11, 90];
    创建一个测试数组,包含无序的数字。
  12. let sortedArr = bubbleSortOptimized(arr);
    调用 bubbleSortOptimized 函数对数组进行排序,并将结果存储在 sortedArr 中。
  13. console.log("优化后的排序数组:", sortedArr);
    输出排序后的数组。

通过这些逐行解释,相信你对冒泡排序算法的实现有了更深入的理解。