🎨
Notes
  • 持续更新中...
  • articles
    • browser
      • 深入理解现代浏览器 - 导航
      • 深入理解现代浏览器 - 架构
      • 深入理解现代浏览器 - 交互
      • 深入理解现代浏览器 - 渲染器进程
    • dsa
      • DSA - 并查集
      • DSA - 哈希表
      • DSA - AVL 树
      • DSA - 二叉树
      • 快速选择
      • Big O 算法复杂度
      • DSA - 栈和队列
      • DSA - 前缀树 Trie
      • DSA - 图
      • DSA - 链表
      • DSA - 递归
    • typescript
      • TypeScript 学习笔记 - 任意属性 (Indexable Types)
      • 力扣的 TypeScript 面试题
      • TypeScript 学习笔记 - as const
      • TypeScript 学习笔记 - infer
    • network
      • Internet Protocol (IP)
      • 计算机网络基础
      • 如何分辨同源和同站
      • DNS 如何查询 IP 地址?
    • vue
      • Nuxt.js 入门
      • 从零实现一个 Mini Vue
      • 从零实现一个简单的 VDOM 引擎
      • 从零实现一个响应式状态管理
    • sorting
      • 排序 - 归并排序
      • 排序 - 冒泡排序
      • 排序 - 选择排序
      • 排序 - 计数排序
      • 排序 - 插入排序
    • compile
      • Compiler and Interpreter
      • Just-In-Time (JIT) Compilers
      • 编译流程
    • others
      • 什么是上下文无关语法
      • 如何在终端打印出有颜色的字
    • dev-ops
      • github-actions
        • GitHub Action 简介
        • GitHub Actions for CI
    • workflow
      • 用 Node 写一个 cli
      • 如何规范 git commit 信息
      • 如何监听 git hooks
      • 如何规范代码风格 - prettier
      • 如何发布一个 npm package
      • 如何规范代码质量 - eslint
    • design-pattern
      • 代理模式
      • 单例模式
      • 策略模式
    • security
      • 点击劫持
      • CSP 内容安全策略
    • javascript
      • 尾调用优化
      • 4种常见的内存泄漏及解决方法
    • unit-test
      • Test Vuejs Application - Chapter 2
      • Test Vuejs Application - Chapter 1
      • Vue Unit Test Intro
    • performance
      • HTTP 缓存
      • 如何优化图片资源
Powered by GitBook
On this page
  • 概念
  • 算法
  • 复杂度
  • 应用
  • 代码

Was this helpful?

  1. articles
  2. sorting

排序 - 冒泡排序

概念

冒泡排序会比较数组中相邻的两个数字,如果这两个数字不是排好序的话(按要求,升序或者降序),就将它们位置交换。

算法

  1. 从 arr[0] 开始,比较 arr[0] 和 arr[1],如果 arr[0] > arr[1],将两者交换位置(升序),否则什么都不做。

  2. 继续比较 arr[1] 和 arr[2],如果 arr[1] > arr[2],将两者交换位置。

  3. 继续比较,直到数组的最后一个数字,这样一轮下来之后,最大的数字就被移动到了数组的最后一个位置。

  4. 回到 arr[0],重复步骤 1-3。

  5. 重复步骤 4 直到数组中的所有数字都排好序。

复杂度

  • 时间复杂度:$O(n^2)$,n 是数组长度。简单地想,有两层循环,最坏的情况是所有数字都需要改变位置,也就是原本的数组是反向排序的,而最好的情况就是 $O(n)$。

  • 空间复杂度:$O(1)$。

应用

  • 不用考虑时间复杂度的时候(时间复杂度是真的很高)。

  • 想要简单实现排序的时候(代码是真的很简单)。

代码

JavaScript

const bubbleSort = arr => {
    while (true) {
        let swapped = false;
        for (let i = 0; i < arr.length - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                // swap
                [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
                // mark
                swapped = true;
            }
        }
        // 没有数字发生交换,说明已经排好序了,结束循环
        if (!swapped) break;
    }
    return arr;
};
Previous排序 - 归并排序Next排序 - 选择排序

Last updated 4 years ago

Was this helpful?