【数据结构学习笔记】冒泡排序

【数据结构学习笔记】冒泡排序

参考电子书:排序算法精讲

算法原理

对未排序的元素进行多次遍历,每次遍历都将相邻的两个元素进行比较,如果它们的顺序错误就交换它们的位置。在每一轮遍历后,最大的元素会被冒泡到序列的末端。这个过程会一直重复,直到没有需要交换的元素为止,此时序列已经排好序

const nums = [2, 5, 7, 4, 1];

for (let i = 0; i < nums.length; i++) {
    for (let j = 0; j < nums.length - i - 1; j++) {
        if (data[j] > data[j + 1]) {
            const temp = data[j];
            data[j] = data[j + 1];
            data[j + 1] = temp;
        }
    }
}
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

优化方式

  • 当 i 为 nums.length - 1 时,nums.length - 1 - i 为 0,可以直接跳过此轮
const nums = [2, 5, 7, 4, 1];

for (let i = 0; i < nums.length - 1; i++) {
    for (let j = 0; j < nums.length - i - 1; j++) {
        if (data[j] > data[j + 1]) {
            const temp = data[j];
            data[j] = data[j + 1];
            data[j + 1] = temp;
        }
    }
}
  • 如果某一轮没有发送交换,那么后续也不会发生交换,数组已经有序
const nums = [2, 5, 7, 4, 1];

for (let i = 0; i < nums.length - 1; i++) {
    let swapped = false;
    for (let j = 0; j < nums.length - i - 1; j++) {
        if (data[j] > data[j + 1]) {
            const temp = data[j];
            data[j] = data[j + 1];
            data[j + 1] = temp;
            swapped = true;
        }
    }
    if (!swapped) break;
}
  • 记录当前轮次最后一次发生交换的位置,后面的序列是有序的,可以跳过
const nums = [2, 5, 7, 4, 1];

let swapped;
let swappedIndex = - 1;
let indexOfLastUnsortedElement = arr.length - 1;
for (let i = 0; i < nums.length - 1; i++) {
    swapped = false;
    for (let j = 0; j < indexOfLastUnsortedElement; j++) {
        if (data[j] > data[j + 1]) {
            const temp = data[j];
            data[j] = data[j + 1];
            data[j + 1] = temp;
            swapped = true;
            swappedIndex = j;
        }
    }
    if (!swapped) break;
    indexOfLastUnsortedElement = swappedIndex;
}

相关例题

LC 283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意,必须在不复制数组的情况下原地对数组进行操作。

/**
 * @param {number[][]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var moveZeroes = function(nums) {
    let swapped;
    for (let i = 0; i < nums.length - 1; i++) {
        swapped = false;
        for (let j = 0; j < nums.length - i - 1; j++) {
            if (nums[j] === 0) {
                const temp = nums[j + 1];
                nums[j + 1] = nums[j];
                nums[j] = temp;
                swapped = true;
            }
        }
        if (!swapped) break;
    }
}

相关推荐

  1. 数据结构学习笔记冒泡排序

    2024-03-13 09:58:02       41 阅读
  2. 数据结构冒泡排序

    2024-03-13 09:58:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-13 09:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-13 09:58:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-13 09:58:02       82 阅读
  4. Python语言-面向对象

    2024-03-13 09:58:02       91 阅读

热门阅读

  1. 双指针算法笔记

    2024-03-13 09:58:02       39 阅读
  2. 在Ubuntu 20.04中设置开机自启动脚本

    2024-03-13 09:58:02       43 阅读
  3. 【设计模式专题之原型模式】5. 矩形原型

    2024-03-13 09:58:02       35 阅读
  4. 项目示例 - 3.服务调用 - 1.Openfeign

    2024-03-13 09:58:02       44 阅读
  5. WPF Command

    2024-03-13 09:58:02       40 阅读
  6. WPF中 INotifyPropertyChanged

    2024-03-13 09:58:02       39 阅读
  7. 力扣每日练习3.12

    2024-03-13 09:58:02       40 阅读
  8. JVM垃圾收集器之CMS垃圾收集器和G1垃圾收集器

    2024-03-13 09:58:02       45 阅读
  9. git 工具常用命令

    2024-03-13 09:58:02       44 阅读
  10. 【Linux的shell原理 与 Linux权限】

    2024-03-13 09:58:02       37 阅读
  11. Git高级玩法:Rebase、Cherry-pick与Stash实战解析

    2024-03-13 09:58:02       41 阅读
  12. flask框架-03

    2024-03-13 09:58:02       33 阅读
  13. 使用Python检测贝叶斯网络的因果关系检测

    2024-03-13 09:58:02       33 阅读
  14. C++/CLI学习笔记3(快速打通c++与c#相互调用的桥梁)

    2024-03-13 09:58:02       40 阅读